ssl.SSLError:[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败Python
问题描述:
我想使用SSL连接到IRC。我写在Python 2.7
。但是,下面的代码:ssl.SSLError:[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败Python
HOST = 'chat.freenode.net'
PORT = 7000
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
code = sock.connect_ex((HOST, PORT))
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
context.verify_mode = ssl.CERT_REQUIRED
context.load_verify_locations('COMODOECCCertificationAuthority.crt')
secure_sock = context.wrap_socket(sock)
PyCharm显示线路故障secure_sock = context.wrap_socket(sock)
有什么不好?
答
context.load_verify_locations('COMODOECCCertificationAuthority.crt')
我不知道文件COMODOECCCertificationAuthority.crt
中是什么,但它看起来像你期待Comodo签署的证书。但是,chat.freenode.net的证书颁发者是Let's Encrypt而不是Comodo。您可以通过例如
$ openssl s_client -connect chat.freenode.net:7000
...
Certificate chain
0 s:/CN=cherryh.freenode.net
i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
i:/O=Digital Signature Trust Co./CN=DST Root CA X3
这意味着您需要信任的根CA是'DST根CA X3'。您可以下载此CA here的证书。如果在load_verify_locations
中将其作为信任添加,则可以使用。
我打开了一个'https:// freenode.net /'页面并使用我的浏览器导出了证书(最新的Firefox)。为什么它没有工作呢? – yak
除了我上面的问题,当我将证书更改为一个您发布的链接,现在我有一个新的错误:'ssl.SSLError:[SSL:TLSV1_ALERT_PROTOCOL_VERSION] tlsv1警报协议版本(_ssl.c:1754)' – yak
@牦牛:一个网站可以为不同的服务使用不同的证书,而freenode正在这样做,即对https和irc使用不同的证书。至于第二个错误:这是一个不同的问题,因此不应该在评论中提问。请提出一个新问题,提供有关此问题的更多详细信息,包括您使用的完整版Python(即2.7.x)和openssl('ssl.OPENSSL_VERSION')。 –