自己署名X509証明書Aを作成し、それを使用して証明書Bを発行するとします。証明書Aを信頼されたルート証明機関に配置して、署名されたすべての証明書が受け入れられるようにします。私の質問は:
次に、証明書Bで保護されたサービスを使用すると、コンピューターは、サービスが実際に証明書Aによって署名されたことをどのようにして知るのですか?親証明書はどういうわけかその子に埋め込まれていますか?
X.509 証明書には、発行者の名前(例ではAの名前)も含まれています(issuerDN
として)。また、証明書には、発行者の証明書をダウンロードできる場所を指す拡張子を含めることができます(「機関情報アクセス」、RFC 5280のセクション4.2.2.1)。すべての証明書は署名されたエンティティであり、これらの署名が検証された後にのみ受け入れられて使用されるため、ほとんど注意を払わずにダウンロードして転送できることに注意してください。最後に、当事者が証明書を表示できるプロトコルでは、必要な中間CA証明書を含む証明書のリストを実際に表示するのが慣例です。これは、たとえば、SSL Certificate
メッセージで発生します。
これはすべて、コンピュータが 認証パスの構築 を実行するための多くの方法を提供します。
CAは証明書を発行するときに、秘密鍵を使用して証明書に署名します。 CAの公開鍵だけが、署名が本物であり、証明書が改ざんされていないことを確認できます。
奇妙なことに、多くのインスタンス(.NETのX509CertificateクラスおよびWindowsで証明書を表示する場合)で署名プロパティが欠落しているように見えます。常に表示されるわけではありませんが、証明書内にあることがわかりました。 DERバイナリ形式の証明書を指定すると、署名者の署名を示すプレーンテキストにデコードできます。
openssl x509 -text -noout -inform DER -in certFile.der
Signature Algorithm: sha1WithRSAEncryption
30:d9:40:ac:d8:0d:46:81:68:14:8a:c6:a7:29:96:4e:b4:58:
7b:e6:12:3f:45:4f:c6:9b:18:aa:f2:99:23:ee:48:df:5f:c0:
a3:c7:e4:ba:3a:bc:6f:58:57:fe:a8:a7:23:d0:d1:9a:47:a6:
42:1a:d8:20:e8:f1:ec:76:43:47:0b:75:d6:a1:d2:71:2b:f7:
19:96:e3:48:57:e2:36:0f:0c:25:5d:7f:f8:26:50:c2:5e:80:
8e:17:ac:37:ad:f1:e3:3c:6f:a3:20:a6:16:93:df:2b:04:9c:
22:d3:01:33:f9:4c:3b:f8:a8:39:f1:6c:41:74:de:ba:96:6a:
0b:f1:e6:f0:7b:d8:1f:42:ec:b5:73:d1:94:1b:01:4a:4c:13:
ca:5e:2b:af:fd:2c:eb:43:d3:fc:2f:ea:5a:8d:db:a9:6a:f6:
b6:9b:58:e1:b7:94:7f:14:6d:11:8b:2c:b7:4e:f3:82:ad:c4:
92:04:c4:97:a3:7a:52:e5:a0:b1:1b:8f:47:bb:43:a3:2c:1a:
fb:31:d9:51:7c:23:7b:57:8e:73:46:81:c4:25:f3:48:c5:a1:
8f:0d:3d:f2:e1:4b:fd:7f:49:b9:f9:b1:2a:c2:22:9e:8a:85:
61:bd:b7:18:8e:56:33:a4:6e:d2:7d:db:2e:37:d0:fb:9a:35:
87:c8:2a:69
から http://en.wikipedia.org/wiki/X.509
この証明書を検証するには、最初の証明書の発行者(Thawte Server CA)と一致する2番目の証明書が必要です。まず、2番目の証明書がCAの種類であることを確認します。つまり、他の証明書の発行に使用できます。これは、X509v3拡張セクションのCA属性の値を検査することによって行われます。次に、CA証明書のRSA公開鍵を使用して、最初の証明書の署名をデコードし、MD5ハッシュを取得します。MD5ハッシュは、残りの証明書に対して計算された実際のMD5ハッシュと一致する必要があります。