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

 

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。

   本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/6194365.html ,如需转载请自行联系原作者


相关文章
|
1月前
|
Python
利用Python生成字符串连接
利用Python生成字符串连接
19 0
|
3月前
|
网络协议 开发者 Python
Python网络编程与Socket通信:连接世界的无限可能
在当今数字化时代,Python作为一种强大的编程语言,通过网络编程与Socket通信为我们打开了连接世界的无限可能。本文将深入探讨Python网络编程的基础知识、Socket通信的原理以及实际应用,帮助读者更好地理解并运用这一技术。
|
3月前
|
Web App开发 移动开发 JavaScript
Python网络编程(三),HTTP协议
Python网络编程(三),HTTP协议
60 0
|
4月前
|
机器学习/深度学习 Python
【Python机器学习】全连接层与非线性回归、防止过拟合方法的讲解及实战( 附源码)
【Python机器学习】全连接层与非线性回归、防止过拟合方法的讲解及实战( 附源码)
71 0
|
1月前
|
SQL 关系型数据库 MySQL
用 Python 连接数据库并进行查询。
【2月更文挑战第12天】【2月更文挑战第32篇】用 Python 连接数据库并进行查询。
|
13天前
|
网络协议 安全 Python
python监听连接请求
【4月更文挑战第5天】本教程介绍了网络编程中服务器监听连接请求的关键步骤。首先,理解监听是服务器在特定端口等待客户端连接的基本概念。接着,设置监听涉及创建套接字、绑定地址和端口,以及开始监听。提供了一个Python示例,展示如何使用socket库实现监听。注意点包括异常处理、并发处理和安全性考虑。学习后,读者能掌握基础的监听连接请求代码编写。
|
1月前
|
网络协议 Python
Python网络编程实现TCP和UDP连接
Python网络编程实现TCP和UDP连接
27 0
|
1月前
|
SQL 关系型数据库 MySQL
使用pymysql工具包连接Python与数据库
使用pymysql工具包连接Python与数据库
33 0
|
1月前
|
网络协议 网络性能优化 Python
python怎么实现tcp和udp连接
python怎么实现tcp和udp连接
16 0
|
2月前
|
SQL 关系型数据库 MySQL
Python中的数据库操作:SQLite与MySQL的连接
Python中的数据库操作:SQLite与MySQL的连接
114 0

热门文章

最新文章