証明書が自己署名されているか、CAによって承認されているかどうかを確認するにはどうすればよいですか?どこかで、自己署名subjectとissuerは同じになると読みましたが、正しいですか?
はい、そうです。証明書が自己署名されている場合、issuerおよびsubjectフィールドには同じ値が含まれます。また、証明書パスにはこの1つの証明書のみが含まれます。
自己署名証明書のサブジェクトフィールドと発行者フィールドは同じですが、a)これは保証されていません。b)逆は当てはまりません。フィールドの値が同じであっても、証明書が自己署名されているわけではありません。
内部ルート(root-ca.crt)と中間証明書(ca.crt)の1つからの出力を次に示します。
$ openssl x509 -subject -issuer -noout -in root-ca.crt
subject= /C=DE/ST=Berlin/L=Berlin/O=classmarkets GmbH/CN=classmarkets CA
issuer= /C=DE/ST=Berlin/L=Berlin/O=classmarkets GmbH/CN=classmarkets CA
$ openssl x509 -subject -issuer -noout -in ca.crt
subject= /CN=classmarkets CA/C=DE/L=Berlin/O=classmarkets GmbH/ST=Berlin
issuer= /C=DE/ST=Berlin/L=Berlin/O=classmarkets GmbH/CN=classmarkets CA
Ca.crtがroot-ca.crtによって署名されていても、フィールドは両方の証明書で同じであることがわかります。
$ openssl x509 -noout -text -in ca.crt | grep -A1 'Key Identifier'
X509v3 Authority Key Identifier:
keyid:A2:2D:AF:A0:D2:64:DF:30:F1:72:39:AC:21:AF:45:D6:D4:12:19:94
--
X509v3 Subject Key Identifier:
30:B0:6B:B5:56:9A:95:7C:31:4B:B2:65:95:0D:F9:EE:E8:3D:3A:C9
$ openssl x509 -noout -text -in root-ca.crt | grep -A1 'Key Identifier'
X509v3 Subject Key Identifier:
A2:2D:AF:A0:D2:64:DF:30:F1:72:39:AC:21:AF:45:D6:D4:12:19:94
Root-ca.crtにAuthority Key Identifier
がないことに注意してください。
RFC328 セクション4.2.1.1の状態(強調は私のもの):
認証パスの構築を容易にするために、authorityKeyIdentifier拡張のkeyIdentifierフィールドは、適合CAによって生成されるすべての証明書に含まれている必要があります。例外が1つあります。 CAが「自己署名」証明書の形式で公開鍵を配布する場合、認証局の鍵識別子は省略できます。自己署名証明書の署名は、証明書のサブジェクトの公開鍵に関連付けられた秘密鍵を使用して生成されます。 (これは、発行者が公開キーと秘密キーの両方を所有していることを証明します。)この場合、サブジェクトとオーソリティキーの識別子は同じですが、証明書パスの構築にはサブジェクトキー識別子が必要です。
そのため、Authority
およびIssuer
フィールドよりもSubject
およびSubject Key
識別子の方が自己署名証明書の方がはるかに優れているようです。自己署名証明書の場合、Authority Key Identifier
は存在しないか、Subject Key Identifier
と同じ値になります。
@Vilicanの回答は技術的に正しいため、ほとんどの場合、この作業を行う必要があります。しかし、私が調べている証明書(特定のWebサイトではない)が自己署名証明書として使用されているのか、それともCA証明書であるのかを知りたいと思っていました。
私が見つけたのは、有効なルートCA証明書には同じ発行者と件名があることです。また、Extensions
-> Certificate Basic Constraints
は、これがCAであること、およびこのCAによって署名される許可された中間CAの数であることを示します。
Webサイトを保護するために使用される自己署名証明書は通常ですがnotはCAとしてマークされ、DNS名はCN
としてマークされますSubject
内。または、Extensions
-> Certificate subject alt name
の下に、許可されたDNS名/ IPアドレスのリストがあります。
証明書のサブジェクトと発行者の一致のみをチェックするのは正しくないと思います。開始日/終了日が異なる証明書や他のメタデータが同じサブジェクトと発行者を持つようにするオプションはたくさんあります。証明書が自己署名されていることを確認するために次の方法を使用しています:
openssl verify -CAfile /cert/to/check.pem -CApath /cert/to/check.pem /cert/to/check.pem
次に、このチェックが失敗した場合、証明書が別の証明書で署名されているかどうかを確認できます。
openssl verify -CAfile /cert/of/issuer.pem -CApath /cert/of/issuer.pem /cert/to/check.pem
CAfile
およびCApath
と同じ証明書を指定すると、OpenSSLのデフォルトの信頼できる証明書に対する検証が成功しなくなります。