2016-03-16 29 views
7

我有如下代碼:SSL上下文

headers = {'content-type': 'ContentType.APPLICATION_XML'} 
uri = "www.client.url.com/hit-here/" 
clientCert = "path/to/cert/abc.crt" 
clientKey = "path/to/key/abc.key" 
PROTOCOL = ssl.PROTOCOL_TLSv1 
context = ssl.SSLContext(PROTOCOL) 
context.load_default_certs() 
context.load_cert_chain(clientCert, clientKey) 
conn = httplib.HTTPSConnection(uri, some_port, context=context) 

我不是一個真正的網絡程序員,所以我做了一些google搜索握手連接,發現ssl.SSLContext(PROTOCOL)爲需要的功能,代碼工作正常。

然後我碰到了障礙,我的本地版本是2.7.10,但是所有的生產盒都有2.7.3,所以SSLContext不支持,升級python版本不是控制選項。

我試過讀ssl — SSL wrapper for socket objects,但沒有意義。

是我的嘗試(白白):

s_ = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s = ssl.wrap_socket(s_, keyfile=clientKey, certfile=clientCert, cert_reqs=ssl.CERT_REQUIRED) 
new_conn = s.connect((uri, some_port)) 

但回報:

SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)') 

問題 - 如何生成對舊版本的SSL上下文,以便有一個安全的HTTPS連接?

+1

我不認爲舊版本可以使用上下文。您是否嘗試創建指定證書的https連接,即conn = httplib.HTTPSConnection(host,port,key_file,cert_file,strict,timeout) –

回答

0

您必須指定ca_certs文件(應指向信任存儲)

+0

您是否可以詳細闡述一下? – NoobEditor

+0

爲了信任服務器證書,您需要擁有服務器的ca_certificate。所以你的wrap_socket應該像ssl.wrap_socket(s_,keyfile = clientKey,certfile = clientCert,ca_certs = cacertfile cert_reqs = ssl.CERT_REQUIRED) –

0

我有使用requests library完美的解決方案。請求庫必須是我以前使用過的我最喜歡的庫,因爲它需要Python中的某些內容難以完成 - SSL和REST請求 - 並使其非常簡單。我檢查了他們的版本支持,並支持Python 2.6+。

這是一個如何使用他們的庫的例子。

>>> requests.get(uri) 

而這就是你所要做的。請求庫負責建立一個ssl連接。


更進一步。如果您需要在請求之間持續Cookie,則可以這樣做。

>>> sess = requests.Session() 
>>> credentials = {"username": "user", 
        "password": "pass"} 
>>> sess.post("https://some-website/login", params=credentials) 
<Response [200]> 
>>> sess.get("https://some-website/a-backend-page").text 
<html> the backend page... </html> 

編輯:如果你需要,你也可以pass in the path to the certificate and the key像這樣requests.get(uri, cert=('path/to/cert/abc.crt', 'path/to/key/abc.key'))


現在希望你可以說服他們在生產箱安裝請求庫,因爲它會非常值得。讓我知道這是否適合你。

+0

request.get不支持加密密鑰,request.post文檔沒有任何證書/關鍵文件...任何想法隊友? – NoobEditor

+0

當它。好吧,我想不出有任何其他方式做到這一點,但如果我這樣做,我會讓你知道。 –