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

标签 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()

当我调用 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

我已经四处搜索了一段时间,并试图找到与我所做的接近的东西,但每个人都指向 PyOpenSSL 或 Twisted,如果我能远离这些库,我更愿意,主要是因为以后在我计划将它带入一个尖锐的生产环境中,在那里我只被允许使用 Python2.6 的内置库。

任何帮助都将不胜感激!

最佳答案

这里的问题是您无法通过自身验证证书(这就是您尝试做的),除非它是自签名的,并且设置了 CA 位。您应该将网站的真实 CA 证书添加到 cacerts.txt 文件中。另一种选择(类似于网络浏览器中的“无论如何连接”)是在您遇到此类异常后将 cert_reqs 放到 ssl.CERT_NONE 中,并了解可能存在一个人在中间。这不是 ssl 模块问题,这是 SSL/X.509 的工作方式。

关于Python 客户端 - SSL 库 - 证书验证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7497213/

相关文章:

python - 变量的范围(局部全局和非局部)如何适用于 Python 中的 List 等可变对象?

python - 如何从 Python 中的嵌套字典中删除某些键?

jquery - 如何通过 JQuery 登录 ALM

python - 不能 "install"plpython3u - postgresql

python - pybind11::dict 中的 pybind11::对象

django - 如何在Django身份验证生成的页面中启用https?

http - Jetty 9.3 SSL-ALPN-HTTP2 错误 ERR_EMPTY_RESPONSE 仅使用 HTTPS

java - 启用 SSL 的 Tomcat 上的非 SSL Web 服务

windows - 使用 SChannel (Windows) 重用 SSL session

apache - 从 Apache httpd 443 到 JBoss 8443 的端口转发