从我的第一个回复的评论中,我发现人们普遍误解了“验证证书的含义”。我会尝试在这里写一个简短的解释,以消除一些幻想。
证书验证是针对某些加密签名检查证书元数据上的签名(即主题、有效期、扩展名等)。
如果用于验证的只是自签名证书,则无法将其与元数据完全相同但密钥不同的另一个自签名证书区分开来,除非您事先知道密钥证书的密钥。并且不要忘记,您建立所有这些验证程序是为了消除拥有这种预先共享知识的要求。通过定期证书验证,您无法完全消除对某些预共享知识的要求,这些知识是一组第三方证书,也称为“CA 证书”。由于这些知识是预先共享的,因此这些证书可能是自签名的,但请记住,您收到的有关这些证书有效性的信息不是来自验证过程,而是来自一些外部知识。
当您在对等方之间分发一组受信任的“CA 证书”时,您可以使用这些证书来签署其他证书,并根据受信任 CA 的预共享知识检查签名。
但是,如果您除了证书本身之外没有关于自签名证书的其他知识,您就不能对这个特定证书的信任做出任何假设,因为它可能是由一些邪恶的黑客以及您值得信赖的服务器颁发的。
请您了解一些相关知识中间人攻击, 公钥基础设施 and 公钥密码学通常在实施任何类型的证书验证过程之前。
请理解,即使不考虑一般的互联网安全,即使您自己的网络中存在聪明的黑客,自签名证书的盲目验证也无法保护您。
Edit:问题作者澄清说,他实际上正在寻找如何使用 M2Crypto 绑定验证证书上的 verisign(或其他 CA)签名。下面是两个例子:
from M2Crypto import X509, SSL
# manual validation of a signature on a certificate using a given CA cert:
ca = X509.load_cert('/path/to/ca_cert.pem')
cert = X509.load_cert('certificate_to_validate.pem')
print "Verification results:", cert.verify(ca.get_pubkey())
# adding a given CA cert to the SSL Context for verification
ctx = SSL.Context()
# load a certificate from file
ctx.load_verify_locations(cafile='/path/to/ca_cert.pem')
# or use all certificate in a CA directory
ctx.load_verify_locations(capath='/path/to/ca/dir')
# or you can specify both options at the same time.
如果您要使用包含许多 CA 证书的目录(这通常更方便),则必须将每个证书重命名为<hash>.0
where <hash>
是证书主题的哈希值(通过以下方式获得)openssl x509 -noout -hash -in cert.pem
).