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 ,如需转载请自行联系原作者


相关文章
|
6天前
|
Python
利用Python生成字符串连接
利用Python生成字符串连接
27 0
|
6天前
|
网络协议 开发者 Python
Python网络编程与Socket通信:连接世界的无限可能
在当今数字化时代,Python作为一种强大的编程语言,通过网络编程与Socket通信为我们打开了连接世界的无限可能。本文将深入探讨Python网络编程的基础知识、Socket通信的原理以及实际应用,帮助读者更好地理解并运用这一技术。
|
6天前
|
网络协议 安全 Python
python中socket客户端关闭连接
【4月更文挑战第7天】本教程介绍了如何在TCP客户端中正确关闭连接。使用`close()`方法可关闭Socket连接并释放资源,示例代码显示了在正常和异常情况下关闭连接的方法。注意异常处理以确保在任何情况下都能关闭连接,并避免并发操作同一Socket,以保证连接的稳定和安全。掌握这些技巧对编写健壮的TCP客户端至关重要。
|
6天前
|
SQL 关系型数据库 MySQL
用 Python 连接数据库并进行查询。
【2月更文挑战第12天】【2月更文挑战第32篇】用 Python 连接数据库并进行查询。
|
6天前
|
Oracle Java 关系型数据库
【服务器】python通过JDBC连接到位于Linux远程服务器上的Oracle数据库
【服务器】python通过JDBC连接到位于Linux远程服务器上的Oracle数据库
17 6
|
6天前
|
SQL 关系型数据库 MySQL
使用Python的pymysql库连接MySQL,执行CRUD操作
使用Python的pymysql库连接MySQL,执行CRUD操作:安装pymysql,然后连接(host='localhost',user='root',password='yourpassword',database='yourdatabase'),创建游标。查询数据示例:`SELECT * FROM yourtable`;插入数据:`INSERT INTO yourtable...`;更新数据:`UPDATE yourtable SET...`;删除数据:`DELETE FROM yourtable WHERE...`。
29 0
|
6天前
|
API Python Windows
python连接chartgtp
【4月更文挑战第30天】使用Python连接ChartGPT API需安装`websocket-client`库,通过`websocket`导入并建立连接至"wss://api.chartgpt.com/v1/websocket"。订阅API如"AAPL",接收并打印响应,然后关闭连接。示例代码包括连接、订阅、接收和关闭步骤。
20 1
|
6天前
|
关系型数据库 MySQL 数据库
Python从入门到精通:2.3.1数据库操作与网络编程:使用Python连接和操作数据库
Python从入门到精通:2.3.1数据库操作与网络编程:使用Python连接和操作数据库
|
6天前
|
网络协议 安全 Java
python中socket关闭连接和释放资源
【4月更文挑战第6天】本教程讲解了网络通信后如何正确关闭连接和释放资源,以保证程序稳定性、性能及避免资源泄露和安全问题。内容涵盖TCP、HTTP连接关闭,数据库连接释放,以及内存、文件句柄、线程等资源管理。建议使用异常处理、遵循编程语言最佳实践,并定期审查代码以优化资源管理。
|
6天前
|
网络协议 Python
python接受客户端连接
【4月更文挑战第5天】本教程详解服务器如何接受客户端连接。过程包括监听、调用`accept`函数、创建新套接字及处理连接。示例代码展示了Python使用socket库接受连接,服务器循环调用`accept`,建立连接后发送欢迎消息并接收数据。注意并发处理、错误处理和资源管理。学习后可应用于实际项目。