私は署名アルゴリズムを少し遊んで、現在使用しているCAのうち、どのCAがSHA2証明書を発行しているかを特定しようとしました。
SHA256ハッシュを指定してCSRを生成し(hash
パラメーターでgnutls-certtool
を使用し、openssl req
パラメーターで-sha256
を使用して)、CSRは署名アルゴリズムとしてsha256WithRSAEncryption
を明確に表示しています。
$ openssl req -noout -text -in test.csr
Certificate Request:
...
Signature Algorithm: sha256WithRSAEncryption
...
ただし、CAからの結果の証明書はsha1WithRSAEncryption
でハッシュされます。
$ openssl x509 -noout -text -in test.crt
Certificate:
Data:
Version: 3 (0x2)
Serial Number: ... (...)
Signature Algorithm: sha1WithRSAEncryption
もちろん、--hash SHA1
(sha1WithRSAEncryption
ハッシュ)を使用してCSRを生成すると、結果の証明書でsha1WithRSAEncryption
が使用されます(期待どおり)。
CAは、ハッシュはCSRではなく注文の一部として指定する必要があると述べています(サードパーティのサービスを介して注文を送信しているため、これはどのような場合でも実行できません)。
したがって問題。 CAはCSRで指定されたハッシュアルゴリズムに従う必要がありますか?
CSRの作成時に指定された署名アルゴリズムはリクエスト自体に署名するに使用されるメッセージダイジェストに対応します。証明書に署名するときにCAにそのアルゴリズムを優先するように求めることは意図されていません。
CSRで使用されるMDはyour要求の信頼レベルを確立しますが、署名はそのダイジェストではなく公開鍵に依存するため、証明書で使用されるアルゴリズムを意味するものではありません。
ほとんどのCAは、「弱い」ことが発見されない限り、特定の発行証明書に対して同じアルゴリズムを使用し、リクエストで使用したメッセージダイジェストを無視します。
優れたCAは、MD5で署名されたCSRを拒否し(信頼できないため、念のため)、Microsoft(2014年)以降、2年以上使用する証明書にSHA256を使用するように強制する必要があります。 2017年1月にSHA-1以下で署名された証明書を拒否する予定です。
私の経験から、CAには独自の設定があり、多くの場合、CAはその内容を変更するつもりはありません(または、ソフトウェアに接続されているため、まったく不可能です)。必須の件名フィールド、キーの使用法、拡張キーの使用法などについて話している...
たとえば、サブジェクトにL、ST、Cを含めたいが、CAはオフになり、C = countyでのみ証明書を取得します。または、単純な.csrを送信し、クライアント認証(1.3.6.1.5.5.7.3.2)やサーバー認証(1.3.6.1.5.5.7.3.1)などの特別な拡張キー使用法の証明書を取得します。また、多くの場合、SAN= CNに等しい、無料です。
証明書にsha1またはsha256で署名したい場合は、RA =登録機関に問い合わせてください。 RAは実際の要求をCAに送信し、使用されたハッシュアルゴリズムを含む設定をセットアップできます。
CAは.csrファイルの署名を使用して、秘密鍵の所有者であることを確認します。