博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python中HTTPS连接
阅读量:6944 次
发布时间:2019-06-27

本文共 1867 字,大约阅读时间需要 6 分钟。

原文

今天写代码时碰到一个问题,花了几个小时的时间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版本的。找到的问题,就很容易知道怎么改写代码了。

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://pnanl.baihongyu.com/

你可能感兴趣的文章
Python 17.3 WSGI接口
查看>>
mysql日常小练习-20171012
查看>>
java之CountDownLatch看看笔记
查看>>
Implement_strStr --leetcode
查看>>
我的友情链接
查看>>
centos 7设置smtp发送163邮件
查看>>
文件服务器之Branchcache分布式缓存
查看>>
我的友情链接
查看>>
Java设计模式百例 - 抽象工厂模式
查看>>
依赖倒置原则 DIP(Dependence Inversion Principle)
查看>>
智能硬件的简单剖析
查看>>
条件判断语句比较
查看>>
List<HashMap<String,String>> list, 根据hashmap中的某个键的值排序
查看>>
在Python中使用SimpleParse模块进行解析
查看>>
Queue容器
查看>>
用户界面框架jQuery EasyUI示例大全之Layout
查看>>
EOF怎么从键盘输入
查看>>
判断2000年---2500年之间的闰年
查看>>
Navicat11.1连接Mysql8.0报错1251的解决办法
查看>>
destoon6.0知道问答原创模板,给需要的人
查看>>