今天寫代碼時碰到一個問題,花了幾個小時的時間,基本上把搜索的前幾頁內(nèi)容都一一看了下,問題最終是解決了,不過過程挺曲折的ssl連接出錯 無法上網(wǎng),所以分享給大家。
原因是以下一段代碼引起的:
.('#39;)
本來這段代碼很簡單的,就是請求一個https的連接,可是報以下錯誤:
.:
第一反應(yīng)是https證書問題產(chǎn)生的,如是以' ssl' 為關(guān)鍵字后,看到大家都在用''這個組件做http請求客戶端,就像java里面的組件一樣,如果安裝完包后,改成如下代碼:
.get('#39;)
還是報以下錯誤:
..: [Errno 1] _ssl.c:504: error::SSL :LO:(1000)
可以看出來,用和報的錯誤信息是一樣,可見它們都是基于相同的底層api操作的,比如基于TLS的連接。到這里的時候我懷疑這個問題不是代碼寫的有問題,可能是操作系統(tǒng)級別的設(shè)置錯了。如下直接在shell客戶端運行如下測試腳本:
果然報如下錯誤:
error::SSL :LO:(1000)
無法建立 SSL 連接。
到這里我懷疑是安裝有問題,更新到最新版本后還是一樣,然后在瀏覽器里訪問是可以的ssl連接出錯 無法上網(wǎng),所以應(yīng)該不是有問題。繼續(xù).......,就發(fā)現(xiàn)有人也遇到過這種問題,說是連接SSL服務(wù)器時SSL的版本不對,如是用如下代碼測試不同的SSL版本,看是不是這個問題:
-1
curl -2
curl -3
分別用上面的三句腳本去測試連接情況,發(fā)現(xiàn)第三種可以連接正常(-1,2,3,數(shù)字分別代碼tlsv1,sslv2,sslv3三個不同的SSL版本)。說明這個https連接所在的服務(wù)器是基于SSLV3版本的。找到的問題,就很容易知道怎么改寫代碼了。
class ():
def (self, , ):
self.= (=,
=,
=ssl.)
s= .()
s.mount('#39;, ())#所有的https連接都用ssl.去連接
s.get('#39;)
實現(xiàn):