簡體   English   中英

Python客戶端 - SSL lib - 證書驗證失敗

[英]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_reqsssl.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM