2017-06-04 201 views
0

我想使用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)有什么不好?

回答

1

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中将其作为信任添加,则可以使用。

+0

我打开了一个'https:// freenode.net /'页面并使用我的浏览器导出了证书(最新的Firefox)。为什么它没有工作呢? – yak

+0

除了我上面的问题,当我将证书更改为一个您发布的链接,现在我有一个新的错误:'ssl.SSLError:[SSL:TLSV1_ALERT_PROTOCOL_VERSION] tlsv1警报协议版本(_ssl.c:1754)' – yak

+1

@牦牛:一个网站可以为不同的服务使用不同的证书,而freenode正在这样做,即对https和irc使用不同的证书。至于第二个错误:这是一个不同的问题,因此不应该在评论中提问。请提出一个新问题,提供有关此问题的更多详细信息,包括您使用的完整版Python(即2.7.x)和openssl('ssl.OPENSSL_VERSION')。 –

相关问题