2015-12-15 131 views
3

我們的付款處理合作夥伴暫時只能支持TLSv1.1。切換處理器現在不是一種選擇。即使我指定TLSv1.1,Python使用TLSv1.2請求模塊

在Python 2.7.10,我有一個腳本,從我開發的Web服務器請求一個GET,但在運行時,它使用TLSv1.2工作,而不是像TLSv1.1我告訴它來。

import requests 
from requests.packages.urllib3.poolmanager import PoolManager 
import ssl 


class MyAdapter(requests.adapters.HTTPAdapter): 
    def init_poolmanager(self, connections, maxsize, block=False): 
     self.poolmanager = PoolManager(
      num_pools=connections, 
      maxsize=maxsize, 
      block=block, 
      ssl_version=ssl.PROTOCOL_TLSv1_1, 
     ) 
     print("poolmanager set") 


def do_it(): 
    with requests.Session() as s: 
     s.mount('https://', MyAdapter()) 
     url = 'https://my.server.com/api/3.0/order/?page=1&limit=10' 
     response = requests.get(url, verify=True) 
     print("status code: %r" % response.status_code) 


if __name__ == '__main__': 
    print do_it() 

輸出是:

poolmanager set 
status code: 200 

我nginx的訪問日誌,但是,說,該協議所用的是TLSv1.2工作:

127.0.0.1 - [15/Dec/2015:13:38:19 -0600] TLSv1.2/ECDHE-RSA-AES128-GCM-SHA256 "GET /api/3.0/order/?page=1&limit=10 HTTP/1.1" 200 176 "-" "python-requests/2.9.0" 

我已經倒在圍繞清貧文檔使用請求庫實現和安裝HTTPAdapter,而且我無法找到任何可以說明我的客戶端爲什麼要講TLSv1.2而不是TLSv1.1的內容,就像我正在講的那樣。

+0

我認爲ssl_verson不正確。應該是ssl_version? – rfkortekaas

+0

@rfkortekaas感謝您的支持。我確信那會是,但糾正這個錯字沒有任何區別。我目前看到使用直接urllib2取得了一些成功,但仍然需要解決問題。我現在會更新這個問題。 – Rjak

+1

您還需要s.get來使用會話對象和HTTPadapter – rfkortekaas

回答

2

解決方案是使用s.get(帶有掛載的HTTPAdapter的Session)而不是requests.get。

+1

s.get()在此上下文中充當requests.get()的插入替換。相同的參數和返回類型。 – Rjak