(Security.SE に関するこの質問に興味があるかもしれません。)
これはX.509 証明書の構造です:
Certificate ::= SEQUENCE {
tbsCertificate TBSCertificate,
signatureAlgorithm AlgorithmIdentifier,
signatureValue BIT STRING }
TBSCertificate ::= SEQUENCE {
version [0] EXPLICIT Version DEFAULT v1,
serialNumber CertificateSerialNumber,
signature AlgorithmIdentifier,
issuer Name,
validity Validity,
subject Name,
subjectPublicKeyInfo SubjectPublicKeyInfo,
issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,
-- If present, version MUST be v2 or v3
subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,
-- If present, version MUST be v2 or v3
extensions [3] EXPLICIT Extensions OPTIONAL
-- If present, version MUST be v3
}
証明書が提示されると、ブラウザーは証明書自体から署名アルゴリズムを取得します。通常、これは のようなものRSAwithSHA1
です。
この場合、TBSCertificate
(証明書の実際の内容) の SHA-1 ダイジェストを実際に再計算できます。
さらに、 からTBSCertificate
発行者名を見つけることができます。これは、既知の CA 証明書からトラスト アンカーを見つけるために使用されるものです (発行者名は CA 証明書のサブジェクトと一致する必要があります)。すでに信頼しているリストに正しい名前の CA 証明書が見つかると、その CA 証明書から公開 RSA キーを取得できます。
SHA-1 ダイジェストと RSA 公開鍵の両方があれば、一致していることを確認できsignatureValue
ます。
デジタル署名は暗号化されたハッシュ値です
一般的に言われていますが、厳密にはそうではありません。デジタル署名はデジタル署名であり、暗号化ではありません。
問題は、RSA が暗号化と署名に同じ数学を使用することです: 公開鍵による暗号化と秘密鍵による署名です。多くの場合、一方が他方と混同されます (OpenSSL API であっても)。「暗号化」は隠すことを意味するため、秘密鍵で「暗号化」することは意味がありません (また、署名を「復号化」できるように公開鍵を渡す場合、何も隠しているわけではありません)。
デジタル署名を使用したハッシュと暗号化に関するこの微妙な点は、署名専用の DSA などの他のアルゴリズムでは機能しません。
これが、多くのデジタル署名 API がハッシュとキーの使用法を単一の「署名」または「検証」操作に結合する理由です。これは Java署名API が行うことです。たとえば、RSAwithSHA1
orを使用するように指示DSAwithSHA1
し、キーとメッセージを渡して、署名または検証するように指示します。ダイジェストまたは「暗号化」を手動で行う必要はありません。
証明書の検証の目的で: ブラウザーは証明書から発行者を取得し、対応する公開鍵を (信頼できる CA 証明書から) 見つけます。証明書から署名アルゴリズムも取得し、その公開鍵と TBSCertificate を使用して署名を検証します。署名アルゴリズムが指示するものに従って、コンテンツ。