如何确定证书是自签名的还是由 CA 授权的?我在某处读到自签名主题和发行人将是相同的,对吗?
如何知道证书是否是自签名的
自签名证书将具有相同的主题和颁发者字段,但 a) 不能保证,并且 b) 反之亦然。仅仅因为字段具有相同的值并不意味着证书是自签名的。
以下是我们的内部根 (root-ca.crt) 和中间证书 (ca.crt) 之一的输出:
$ 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
注意Authority Key Identifier
root-ca.crt 中没有。
RFC3280在第 4.2.1.1 节(强调我的)中声明:
authorityKeyIdentifier 扩展的 keyIdentifier 字段必须包含在符合 CA 生成的所有证书中,以促进证书路径的构建。有一个例外; 如果 CA 以“自签名”证书的形式分发其公钥,则可以省略授权密钥标识符。自签名证书上的签名是使用与证书的主题公钥关联的私钥生成的。(这证明发行者拥有公钥和私钥。) 在这种情况下,主题和授权密钥标识符将是相同的,但证书路径构建只需要主题密钥标识符。
所以在我看来,Authority
andSubject Key
标识符是自签名证书的一个比Issuer
andSubject
字段更好的指标。对于自签名证书,Authority Key Identifier
将不存在或具有与Subject Key Identifier
.
是的,它是真的。当证书是自签名时,颁发者和主题字段包含相同的值。此外,证书路径中将只有这一个证书。
@Vilican 的回答在技术上是正确的,并且大部分时间都应该完成这项工作。但我想知道我正在检查的证书(不是某个特定的网站)是用作自签名证书还是 CA 证书。
我发现有效的根 CA 证书具有相同的颁发者和主题。也Extensions
->Certificate Basic Constraints
表示这是一个 CA 以及允许的中间 CA 的数量由该 CA 签名。
虽然用于保护网站的自签名证书通常不标记为 CA ,但其 DNS 名称如CN
. 和/或在->Subject
下有一个允许的 DNS 名称/IP 地址列表。Extensions
Certificate subject alt name
我想只检查证书的主题和颁发者的匹配是不正确的。有很多选择,其中具有不同开始/结束日期或其他元数据的不同证书具有相同的主题和颁发者。我正在使用以下方法来检查证书是自签名的:
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
指定与 OpenSSL 的默认可信证书相同的证书CAfile
并CApath
阻止成功验证。