使用python验证SSL中的对等点
我试图找出如何用python验证服务器的自签名证书。我在谷歌上找不到多少数据。我还想确保服务器url使用python验证SSL中的对等点,python,ssl,Python,Ssl,我试图找出如何用python验证服务器的自签名证书。我在谷歌上找不到多少数据。我还想确保服务器url 提前感谢您提供的任何见解。无法验证自签名证书,因为它本身就是自签名证书 您必须由其他受信任的第三方证书签署证书才能验证任何内容,然后您可以将该第三方证书添加到受信任CA的列表中,然后您将能够验证由该证书/CA签署的证书 如果您希望获得有关如何在Python中执行此操作的建议,那么应该提供您正在使用的SSL库的名称,因为Python有多种SSL库可供选择。我假设您使用了一些OpenSSL绑定。我有
提前感谢您提供的任何见解。无法验证自签名证书,因为它本身就是自签名证书 您必须由其他受信任的第三方证书签署证书才能验证任何内容,然后您可以将该第三方证书添加到受信任CA的列表中,然后您将能够验证由该证书/CA签署的证书
如果您希望获得有关如何在Python中执行此操作的建议,那么应该提供您正在使用的SSL库的名称,因为Python有多种SSL库可供选择。我假设您使用了一些OpenSSL绑定。我有两种方法可以解决你的问题
openssl version-d
以查看您的系统的证书)。这将影响计算机上使用openssl的所有程序从对我第一次答复的评论中,我发现人们普遍误解了“验证证书”的含义。我将尝试在这里写一个简短的解释,以消除一些错觉 证书验证是针对某些加密签名检查证书元数据上的签名(即主题、有效期、扩展等) 如果验证所需的只是一个自签名证书,则无法将其与另一个元数据完全相同但密钥不同的自签名证书区分开来,除非您事先知道密钥证书的密钥。不要忘记,您建立了所有这些验证程序,以消除预先共享知识的要求。通过定期的证书验证,您无法完全取消某些预先共享知识的要求,这是一组第三方证书,也称为“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.
如果要使用包含许多CA证书的目录(这通常更方便),则必须将每个证书重命名为.0
,其中
是证书主题的哈希值(通过openssl x509-noout-hash-in cert.pem
获得)。您询问“使用python验证SSL中的对等方”
我倾向于使用本地“信任存储”-目录已满或.crt
、.pem
或.der
文件,根据本地证书目录验证服务器是否可靠:
#!/usr/bin/env python3
from socket import socket
import ssl
hostname = 'google.com'
port = 443
with socket() as sock:
sock.setblocking(True)
sock.connect((hostname, port))
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.verify_flags = 0x80000 # will verify if either the Root CA or Int CA is present for the server
context.load_verify_locations(cafile=None,
cadata=None,
capath="ca_files/")
with context.wrap_socket(sock=sock,
server_hostname=hostname,
do_handshake_on_connect=False) as ssl_sock:
ssl_sock.do_handshake()
print(hostname, ssl_sock.getpeername(), ssl_sock.version())
print(ssl_sock)
正如@abbott所说,在运行脚本之前,您需要capath
的符号链接才能工作。如果您安装了OpenSSL
,这将非常简单:
$ export CERTS=/path/to/ca_files
$ openssl/bin/c_rehash ${CERTS}
如果不运行
c_rehash
它将无法工作。有关更多信息,请参见man c_rehash
所有顶级CA证书都是自签名的,没有问题,不必验证(信任)它们。当然,您可以验证自签名证书,您只需将证书复制到本地即可。在这一点上,它基本上是一个公钥/私钥身份验证。许多本地身份验证系统都是这样工作的,通过使用x.509证书来验证主机是否合法。查看certmaster和func for python示例使用此代码,您不是在验证自签名证书,而是显式地将其添加到受信任的证书存储中,这样它将“验证”自身。将证书添加到openssl目录的操作与此完全相同。再一次,验证自签名证书是不可能的:任何自签名证书都将通过验证测试。实际上,我正在寻找使用M2Crypto的verisign签名证书验证。如果您已经拥有证书的可信预共享知识,您可以验证证书,我投了赞成票。还有一件事要记住,什么时候使用SSL(特别是SSL客户端)的原因是,您通常还需要验证您是否与正确的主机进行了通信。M2Crypto会自动做到这一点。
$ export CERTS=/path/to/ca_files
$ openssl/bin/c_rehash ${CERTS}