给定某个CRL,例如:
http://crl.verisign.com/pca1.crl
下载它,并要求openssl
验证它并显示其内容就像一个魅力:
wget http://crl.verisign.com/pca1.crl
openssl crl -in ./pca1.crl -inform DER -text
verify OK
Certificate Revocation List (CRL):
Version 1 (0x0)
Signature Algorithm: sha1WithRSAEncryption
Issuer: /C=US/O=VeriSign, Inc./OU=Class 1 Public Primary Certification Authority
Last Update: Nov 22 00:00:00 2011 GMT
Next Update: Mar 21 23:59:59 2012 GMT
...
[truncated]
有没有办法找出 哪个 CA证书验证了这个CRL的真实性?
或者是循环证书库中证书的唯一方法,并逐个尝试,直到匹配为止?
答案 0 :(得分:2)
简单的方法是检查输出:
curl --silent http://crl.verisign.com/pca1.crl |openssl crl -inform DER -noout -issuer
这将是:
issuer=/C=US/O=VeriSign, Inc./OU=Class 1 Public Primary Certification Authority
因为这将告诉您发行人,即签署 CRL的实体,不一定是颁发撤销证书的实体(尽管通常是这样)。
您可以更进一步,并通过以下方式验证:
curl --silent -O ca.pem http://www.verisign.com/repository/roots/root-certificates/PCA-1.pem
curl --silent http://crl.verisign.com/pca1.crl |\
openssl crl -inform DER -noout -CAfile PCA-1.pem
并检查您是否看到了
verify OK
或者 - 如果您有证书商店 - 寻找与您在发行人处找到的DN相同的发行人;然后检查签名(比较DN不够好 - 有人可能插入了假冒/自签名的DN)。
我认为你不能做得更好,因为包括Verisign在内的很多CA都没有用标识符来装饰他们的CRL(你可以用curl --silent http://crl.verisign.com/pca1.crl |openssl asn1parse -inform DER
确认)。所以你真的要提取DN,在你的藏匿处通过字符串比较找到一个DN,然后检查签名。理想情况下,实际上与签名实际签署的DN部分进行比较;作为一个邪恶的条目,理论上可以使DN很少(例如只是国家)签署(从而允许最后一刻改变/匹配)。