2017-06-27 66 views
1

我有一個定製的HTTP/S客戶端(基於twisted.HTTPClient),它連接到真實世界的服務器,所以我需要處理錯誤的證書。如何確定證書驗證錯誤

當我連接到https://expired.badssl.com時,收到一個OpenSSL.SSL.Error,其中args /消息爲[('SSL例程','SSL3_GET_SERVER_CERTIFICATE','證書驗證失敗']]。到現在爲止還挺好..!

在我的情況下,我需要以特定的方式處理證書錯誤,那麼如何消除這種類型的SSL.Error與其他人的歧義? 我可以找到的唯一方法是做一個字符串比較......這感覺...錯了。

+0

在適當的OpenSSL的情況下,你會叫['SSL_get_verify_result'(https://開頭WWW。 openssl.org/docs/man1.0.2/ssl/SSL_get_verify_result.html)獲得成功/失敗狀態。在失敗的情況下,代碼將表示已過期的證書,不可信的路徑/鏈等。注意手冊頁上的鏈接似乎有些彎曲。以下是['verify' app](https://www.openssl.org/docs/man1.0.2/apps/verify.html)與原因/錯誤代碼的鏈接。我不確定你在Python中做了什麼。另請參閱OpenSSL wiki上的[SSL/TLS Client](https://wiki.openssl.org/index.php/SSL/TLS_Client)。 – jww

回答

0

我能找到的唯一方法是做一個字符串比較... 這感覺...錯了。

我認爲這是唯一的方法。

OpenSSL.SSL.Error是SSL異常的基類。 AFAIK,當它直接產生時,消除錯誤類型的唯一方法是通過比較錯誤消息元組內的原因。

從pyopenssl文檔:

「每當這個異常直接拉高,它已經從OpenSSL的錯誤隊列,其中每個項目是一個元組(LIB,功能,原因)錯誤信息的列表,在這裏LIB ,功能,原因是所有的字符串,描述在何處以及是什麼問題」

見: https://pyopenssl.readthedocs.io/en/stable/api/ssl.html#OpenSSL.SSL.Error