2017-06-04 197 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')。 –

相關問題