abb*_*bot 10
从评论到我的第一个回复,我发现存在一个普遍的误解,即"验证证书意味着什么".我将尝试在这里写一个简短的解释来消除一些幻想.
证书验证是针对某些加密签名检查证书元数据上的签名(即主题,有效期,扩展等).
如果验证的所有内容都是自签名证书,则无法将其与具有完全相同元数据的另一个自签名证书区分开来,除非您事先知道密钥证书的密钥.并且不要忘记您建立所有这些验证程序以取消具有此预共享知识的要求.通过定期证书验证,您无法完全删除具有某些预共享知识的要求,这是一组第三方证书,也称为"CA证书".由于这些知识是预先共享的,因此这些证书可能是自签名的,但请记住,您已收到有关这些证书的有效性的信息,而不是来自验证过程,而是来自某些外部知识.
如果在对等体之间分配了一组受信任的"CA证书",则可以使用这些证书签署其他证书,并根据可信CA的预共享知识检查签名.
但是,如果您没有关于自签名证书的其他知识,除了证书本身,您不能对该特定证书的信任做出任何假设,因为它可以由一些邪恶的黑客以及您值得信赖的服务器发布.
在实施任何类型的证书验证过程之前,请获取一些关于中间人攻击,公钥基础设施和公钥加密的知识.
请理解,对自签名证书的盲目验证不会保护您,甚至不会保护您自己网络中的聪明黑客,甚至不考虑一般的互联网安全.
编辑:问题作者澄清说他实际上正在寻找如何使用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.
Run Code Online (Sandbox Code Playgroud)
如果你要使用许多CA证书的目录(通常是更方便),你必须重新命名每个证书来<hash>.0
这里<hash>
是证书主题(与获得的哈希openssl x509 -noout -hash -in cert.pem
).