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.signeropts の opts パラメータを使用すると、次の場合にタイプ crypto.hash のハッシュ関数の識別子を取得できます。 sign() 関数を使用して、正しいプレフィックスを適用します。 リーリー
それは魔法のように機能します。ただし、もっと良いことがあります。
ckm_rsa_pkcs メカニズムは、rsassa-pkcs1-v1_5 タイプの署名を提供します。この古い署名スキームについては、興味のある読者がご自身で調査していただくようお願いします。この古い署名スキームは新しい製品やソフトウェアでは使用すべきではありません。
実際、rsassa-pss 型署名を提供する ckm_rsa_pkcs_pss メカニズムを使用することをお勧めします。
この原則から出発して、これが私が現在使用している実装です。リーリー
したがって、プレフィックスは必要なくなりましたが、ハッシュ アルゴリズム識別子と使用する署名アルゴリズムと使用する mgf の対応付けが必要になります。最後に、Go では、使用される
署名アルゴリズム は、x509.sha256withrsa、x509.sha384withrsa、または x509.sha512withrsa## ではなくなりました #ただし、sha256withrsapss、sha384withrsapss、および sha512withrsapss です。 署名おめでとうございます。
以上がカスタムの crypto.Signer 実装を使用して X.509 証明書を生成できないの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。