Python中HTTPS連接


permike 原文  Python中HTTPS連接

今天寫代碼時碰到一個問題,花了幾個小時的時間google,


首先需要安裝openssl,更新到最新版本后,在瀏覽器里看是否可訪問,如果是可以的,所以應該不是openssl有問題。

然后使用 curl嘗試訪問

 

https://ui2web1.apps.uillinois.edu/BANPROD1/bwskfcls.P_GetCrse

可以查看ssl版本,如果不能訪問,嘗試更換ssl版本

1
2
3
4
5
curl -1 https: //xxx .com
 
curl -2 https: //xxx .com
 
curl -3 https: //xxx .com

分別用上面的三句腳本去測試連接情況,發現第三種可以連接正常(-1,2,3,數字分別代碼tlsv1,sslv2,sslv3三個不同的SSL版本)。說明這個https連接所在的服務器是基於SSLV3版本的。找到的問題,就很容易知道怎么改寫Python代碼了。

1
2
3
4
5
6
7
8
9
class  MyAdapter(HTTPAdapter):
     def  init_poolmanager( self , connections, maxsize):
         self .poolmanager =  PoolManager(num_pools = connections,
             maxsize = maxsize,
             ssl_version = ssl.PROTOCOL_SSLv3)
 
s =  requests.Session()
s.mount( 'https://' , MyAdapter()) #所有的https連接都用ssl.PROTOCOL_SSLV3去連接
s.get( 'https://xxx.com' )

urllib2實現:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# custom HTTPS opener, banner's oracle 10g server supports SSLv3 only
import  httplib, ssl, urllib2, socket
class  HTTPSConnectionV3(httplib.HTTPSConnection):
     def  __init__( self , * args, * * kwargs):
         httplib.HTTPSConnection.__init__( self , * args, * * kwargs)
         
     def  connect( self ):
         sock =  socket.create_connection(( self .host, self .port), self .timeout)
         if  self ._tunnel_host:
             self .sock =  sock
             self ._tunnel()
         try :
             self .sock =  ssl.wrap_socket(sock, self .key_file, self .cert_file, ssl_version = ssl.PROTOCOL_SSLv3)
         except  ssl.SSLError, e:
             print ( "Trying SSLv3." )
             self .sock =  ssl.wrap_socket(sock, self .key_file, self .cert_file, ssl_version = ssl.PROTOCOL_SSLv23)
             
class  HTTPSHandlerV3(urllib2.HTTPSHandler):
     def  https_open( self , req):
         return  self .do_open(HTTPSConnectionV3, req)
# install opener
urllib2.install_opener(urllib2.build_opener(HTTPSHandlerV3()))
 
if  __name__ = =  "__main__" :
     r =  urllib2.urlopen( "https://ui2web1.apps.uillinois.edu/BANPROD1/bwskfcls.P_GetCrse" )
     print (r.read())

可以看到這兩種方案的原理都是一樣,就是自定義連接處理器,改變連接時ssl的版本號。

參考文章:http://bugs.python.org/issue11220

              https://github.com/kennethreitz/requests/issues/606

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM