カスタムの crypto.Signer 実装を使用して X.509 証明書を生成できない

PHPz
リリース: 2024-02-10 20:42:07
転載
792 人が閲覧しました

无法使用自定义 crypto.Signer 实现生成 X.509 证书

php エディターの Youzi は、X.509 証明書の生成に関する問題を紹介します。カスタムの crypto.Signer 実装を使用して証明書を生成すると、使用できない問題が発生することがあります。この問題により、開発者は解決方法について混乱する可能性があります。この記事では、この問題の原因を調査し、開発者が独自の X.509 証明書を正常に生成できるようにするための解決策をいくつか紹介します。

質問内容

hsm に保存されている rsa キー ペアに基づいて x.509 証明書を生成しようとしています。私はこの pkcs #11 実装を使用して hsm と通信します。

暗号オブジェクトは後者に保存されているため、実行したい操作 (署名など) に秘密キーが必要な場合は、「秘密キーにアクセス」するために crypto.signer インターフェイスを実装する必要があります。これが実装です。

リーリー

この実装は機能します。たとえば、csr を作成するには、createcertificaterequest 関数で csr に署名するための秘密キー (priv any パラメーター) が必要です。ここで rsasigner インスタンスを提供します。

createcertificate 関数も似ています。パラメータ pub は生成される証明書の公開鍵、priv は署名者の秘密鍵です。

以下のコードでは、自己署名 x.509 証明書を生成しようとしています。そのため、API によれば、template パラメーターと parent パラメーターは同じです。

リーリー

キーのタイプ (rsa または ec) に関係なく、この関数は次のエラーを返します。

リーリー

このエラーは、crypto.signer の実装が正しく完了していない場合に返されます。

楕円曲線上のキーペアを使用して同じことをしようとして crypto.signer を実装しましたが、エラーは同じです。

sign 関数でさまざまなハッシュ アルゴリズムも試しましたが、何も変わりませんでした。

このエラーは crypto.signer の実装に起因しているようですが、CSR の生成に使用できます。

解決策

この問題の解決策は数​​か月前に見つかりましたが、時間をかけて答えを共有することはありませんでしたが、今がその時です。

pkcs #11 経由で直接署名する場合は、ここで参照されている digestinfo 値をハッシュの前に手動で付けることで、ハッシュ プレフィックスを管理する必要があります: https://www .rfc-editor.org /rfc/rfc3447#page-43

より正確には、rsassa-pkcs1-v1_5 署名の場合、実際の署名関数への入力は asn.1 der でエンコードされた構造です。 pkcs #11 には構造の生成方法を認識するハッシュ固有のメカニズム (例: ckm_sha256_rsa_pkcs) がありますが、それらはすべてデータがハッシュされていないことを前提としています。 暗号通貨の場合はそうではありません。そのため、生の署名操作のみを実行する汎用の cka_rsa_pkcs メカニズムを使用する必要があります。これは、asn.1 構造を自分で生成する必要があることを意味します。これは、使用するすべてのハッシュに正しいプレフィックスを指定するだけで実行できます。

タイプ

crypto.signeroptsopts パラメータを使用すると、次の場合にタイプ crypto.hash のハッシュ関数の識別子を取得できます。 sign() 関数を使用して、正しいプレフィックスを適用します。 リーリー

それは魔法のように機能します。ただし、もっと良いことがあります。

ckm_rsa_pkcs メカニズムは、rsassa-pkcs1-v1_5 タイプの署名を提供します。この古い署名スキームについては、興味のある読者がご自身で調査していただくようお願いします。この古い署名スキームは新しい製品やソフトウェアでは使用すべきではありません。

実際、

rsassa-pss 型署名を提供する ckm_rsa_pkcs_pss メカニズムを使用することをお勧めします。

この原則から出発して、これが私が現在使用している実装です。

リーリー

したがって、プレフィックスは必要なくなりましたが、ハッシュ アルゴリズム識別子と使用する署名アルゴリズムと使用する mgf の対応付けが必要になります。

最後に、Go では、使用される

署名アルゴリズム は、x509.sha256withrsa、x509.sha384withrsa、または x509.sha512withrsa## ではなくなりました #ただし、sha256withrsapsssha384withrsapss、および sha512withrsapss です。 署名おめでとうございます。

以上がカスタムの crypto.Signer 実装を使用して X.509 証明書を生成できないの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!