Python客户端 - SSL lib - 证书验证失败

Tor*_*xed 11 python ssl https client verify

我正在尝试为学习目的做一个小型安全HTTPS客户端,看看SSL的所有机制现在如何在更高层次上工作,所以我试图通过ssl.wrap_socket将一个简单的套接字转换为ssl.

我可能倒退了整个概念但是,这就是我正在做的事情:

s.connect((host, port))
if port == 443:
    f = open('cacerts.txt', 'r')
    calist = f.read()
    f.close()
    ca = ssl.get_server_certificate((host, port), ssl_version=ssl.PROTOCOL_SSLv3|ssl.PROTOCOL_TLSv1)
    if not ca in calist:
        f = open('cacerts.txt', 'a')
        f.write(ca)
        f.close()
    s = ssl.wrap_socket(s, ssl_version=ssl.PROTOCOL_SSLv3|ssl.PROTOCOL_TLSv1, cert_reqs=ssl.CERT_REQUIRED, ca_certs="cacerts.txt")
    s.do_handshake()
Run Code Online (Sandbox Code Playgroud)

当我调用do_handshake()时,我得到了这个:

Traceback (most recent call last):
  File "SSL_test.py", line 84, in Requester
    s = ssl.wrap_socket(s, ssl_version=ssl.PROTOCOL_SSLv3|ssl.PROTOCOL_TLSv1, cert_reqs=ssl.CERT_REQUIRED, ca_certs="cacerts.txt")
  File "C:\Python26\lib\ssl.py", line 338, in wrap_socket
    suppress_ragged_eofs=suppress_ragged_eofs)
  File "C:\Python26\lib\ssl.py", line 120, in __init__
    self.do_handshake()
  File "C:\Python26\lib\ssl.py", line 279, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [Errno 1] _ssl.c:490: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
Run Code Online (Sandbox Code Playgroud)

我已经搜索了一段时间,并试图找到一些与我的工作接近的东西,但每个人都指向PyOpenSSL或Twisted,我更喜欢我是否可以不在这些库中,主要是因为后来我我计划将其带入一个敏锐的生产环境,我只允许使用Python2.6的内置库.

任何帮助都会很棒!

abb*_*bot 9

这里的问题是你不能用自己验证证书(这是你想要做的),除非它是自签名的,并且设置了CA位.您应该将该网站的真实CA证书添加到该cacerts.txt文件中.另一种选择(有点像在Web浏览器"连接反正")是砸cert_reqsssl.CERT_NONE你这样的异常后,并了解有可能可能是在中间的人.这不是ssl模块问题,这是SSL/X.509的工作方式.