証明書のシリアル番号とそのSHA1ハッシュの違いを理解するのに問題があります。
MSDNは言う:
シリアル番号証明書を一意に識別する番号で、認証局によって発行されます。
では、シリアル番号で証明書を識別できますか?
ウィキペディアはハッシュについて言っています:
Thumbprint:公開鍵証明書の省略形として使用されるハッシュ自体。
したがって、ハッシュは(RSAなどの)キーを識別します。
私は現在、Androidアプリの証明書についていくつか調査を行っており、興味深い証明書をいくつか見つけました。
[Issuer][Serial][SHA1 Hash][Valid From]
[C=US, L=Mountain View, S=California, O=Android, OU=Android, CN=Android, [email protected]][00936EACBE07F201DF][BB84DE3EC423DDDE90C08AB3C5A828692089493C][Sun, 29 Feb 2008 01:33:46 GMT]
[C=US, L=Mountain View, S=California, O=Android, OU=Android, CN=Android, [email protected]][00936EACBE07F201DF][6B44B6CC0B66A28AE444DA37E3DFC1E70A462EFA][Sun, 29 Feb 2008 01:33:46 GMT]
[C=US, L=Mountain View, S=California, O=Android, OU=Android, CN=Android, [email protected]][00936EACBE07F201DF][0B4BE1DB3AB39C9C3E861AEC1348110062D3BC1B][Sun, 29
また、同じシリアル番号を共有しているが、ハッシュが異なるものは他にもたくさんあります。
それで、異なるキーを持つ証明書がある可能性がありますか? Androidアプリの証明書を作成するときに実際にシリアル番号を作成しているのは誰ですか?ハッシュについては明らかですが、別の証明書と同じシリアル番号で新しい証明書を作成できますか?
同じシリアル番号の証明書が同じ人物によって作成されたと確信できますか?
certificate では、シリアル番号が証明書を発行したCAによって選択されます。証明書に記載されているだけです。 CAは、ランダムである必要はなく、適切と思われる方法でシリアル番号を選択できます(20バイトに収まる必要があります)。 CAは想定で一意のシリアル番号を選択します。つまり、一意のCAの場合です。シリアル番号が世界中で一意であることを期待することはできません。 X.509の夢の世界では、世界中でユニークなのは発行者DNとシリアルのペアです(各CAは独自の一意の識別名を持ち、シリアル番号を再利用しないように注意しています)。
thumbprintは、署名を含むすべてのフィールドを含む完全な証明書に対して計算されたハッシュ値です。その1つis使用されるハッシュ関数の固有の衝突抵抗まで、特定の証明書について世界中で一意です。 MicrosoftソフトウェアはSHA-1を使用する傾向があり、理論的な弱点がいくつか知られています。 (まだ)実際の衝突は発生していません。 SHA-1での 衝突攻撃 は、CWIとGoogleの研究者によって実証されました。
(表示する拇印は、40ビットの16進文字、つまり160ビットで構成されているように見えますが、これもまた、もっともらしいハッシュ関数としてSHA-1を指しています)。
拇印は、バイナリ.DER形式の証明書のsha1sumまたはsha256sumです。つまり、Unix端末から次のコマンドを実行します。
sha1sum /path/to/mycertificate.der
そのコマンドの16進出力はあなたの拇印です。指紋とも呼ばれます。試してみてください。