[英]Python client - SSL lib - certificate verify failed
我正在嘗試為學習目的做一個小型安全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
文件中。 另一種替代方法(在Web瀏覽器中類似“無論如何連接”)是在獲得此類異常后將cert_reqs
到ssl.CERT_NONE
,並了解中間可能有一個人。 這不是ssl
模塊的問題,這就是SSL / X.509的工作原理。
如果您剛剛學習,您也可以使用Anonymous Diffie-Hellman ,即服務器根本沒有證書,而您的客戶端並不關心驗證它。
下面是一個簡單(和不安全)的測試。
測試服務器,由openssl
包提供:
openssl s_server -nocert -cipher "ALL:aNULL:eNULL"
在Python
測試客戶端:
...
ssl.wrap_socket(..., ciphers="ALL:aNULL:eNULL")
...
-
如果你想玩證書, openssl
包可以生成你想要的東西,但要正確使用它有點棘手。 好的GUI工具是TinyCA
,它是用perl編寫的並使用openssl命令,但為您提供了一個很好的框架來創建自己的CA,簽署自己的證書等。
如果你趕時間,只需安裝apache,啟動它,你的發行版(linux或wamp)很可能會創建一個自簽名證書來幫助你入門。 將apache配置為可以使用瀏覽器連接到https://localhost
的位置。 然后使用該服務器進行連接,如果您將服務器的自簽名CA添加到客戶端CA列表/文件中,我認為您將順便通過。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.