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


相关文章
|
5月前
|
数据采集 Web App开发 iOS开发
解决Python爬虫访问HTTPS资源时Cookie超时问题
解决Python爬虫访问HTTPS资源时Cookie超时问题
|
NoSQL Unix 网络安全
【Azure Cache for Redis】Python Django-Redis连接Azure Redis服务遇上(104, 'Connection reset by peer')
【Azure Cache for Redis】Python Django-Redis连接Azure Redis服务遇上(104, 'Connection reset by peer')
154 0
【Azure Cache for Redis】Python Django-Redis连接Azure Redis服务遇上(104, 'Connection reset by peer')
|
关系型数据库 MySQL 数据库连接
python脚本:连接数据库,检查直播流是否可用
【10月更文挑战第13天】本脚本使用 `mysql-connector-python` 连接MySQL数据库,检查 `live_streams` 表中每个直播流URL的可用性。通过 `requests` 库发送HTTP请求,输出每个URL的检查结果。需安装 `mysql-connector-python` 和 `requests` 库,并配置数据库连接参数。
273 68
|
9月前
|
SQL 关系型数据库 数据库连接
|
IDE 网络安全 开发工具
IDE之pycharm:专业版本连接远程服务器代码,并配置远程python环境解释器(亲测OK)。
本文介绍了如何在PyCharm专业版中连接远程服务器并配置远程Python环境解释器,以便在服务器上运行代码。
3954 0
IDE之pycharm:专业版本连接远程服务器代码,并配置远程python环境解释器(亲测OK)。
|
NoSQL Linux Redis
linux安装单机版redis详细步骤,及python连接redis案例
这篇文章提供了在Linux系统中安装单机版Redis的详细步骤,并展示了如何配置Redis为systemctl启动,以及使用Python连接Redis进行数据操作的案例。
375 3
|
Linux Python
Linux之centos安装clinkhouse以及python如何连接
Linux之centos安装clinkhouse以及python如何连接
|
Unix Linux 网络安全
python中连接linux好用的模块paramiko(附带案例)
该文章详细介绍了如何使用Python的Paramiko模块来连接Linux服务器,包括安装配置及通过密码或密钥进行身份验证的示例。
741 1
|
测试技术 API 数据安全/隐私保护
Python连接到Jira实例、登录、查询、修改和创建bug
通过使用Python和Jira的REST API,可以方便地连接到Jira实例并进行各种操作,包括查询、修改和创建Bug。`jira`库提供了简洁的接口,使得这些操作变得简单易行。无论是自动化测试还是开发工作流的集成,这些方法都可以极大地提高效率和准确性。希望通过本文的介绍,您能够更好地理解和应用这些技术。
1133 0
|
SQL Oracle 关系型数据库
Python连接Oracle
Python连接Oracle
177 0

推荐镜像

更多