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
Python中HTTPS连接的更多相关文章
- ConnectionPool实现redis在python中的连接
这篇文章主要介绍了Python与Redis的连接教程,Redis是一个高性能的基于内存的数据库,需要的朋友可以参考下 今天在写zabbix storm job监控脚本的时候用到了python的re ...
- python中字符串连接的四种方式
以下实例展示了join()的使用方法 #!/usr/bin/python str = "-"; seq = ("a", "b", " ...
- python中字符串连接的三种方式
1.字符串之间连接 'aa' 'bb' 可以中间为空格 或者什么都没有. 那么输出都是两者之间紧密相连. 2.字符串+数字 'aa' +90 这样会报错,因为不同类型不能相加, 可以用 'aa',90 ...
- PYTHON中 赋值运算的若干问题总结
1.PYTHON中没有自增自减操作(++,——): 因为PYTHON中对于字符.数值等不可变的对象来说,自增自减没有意义. 2.PYTHON中l连接操作总是创建一个新对象. 举例: L=[1,2] M ...
- python中实现mysql连接池
python中实现mysql连接池 import pymysql from DBUtils.PooledDB import PooledDB MYSQL_HOST = 'localhost' USER ...
- python中的MySQL数据库操作 连接 插入 查询 更新 操作
MySQL数据库 就数据库而言,连接之后就要对其操作.但是,目前那个名字叫做qiwsirtest的数据仅仅是空架子,没有什么可操作的,要操作它,就必须在里面建立“表”,什么是数据库的表呢?下面摘抄自维 ...
- python中如何将字符串连接在一起,多倍的字符串如何输出
说明: 在python中,如果有多个字符串,想要连接在一起,或者说想要拼接在一起该如何操作,在此记录下. 操作过程: 1.通过 + 这个加号操作符,将字符串拼接在一起 >>> &qu ...
- Ubuntu中安装memcache并且在Python中连接memcache
1.安装memcache到Ubuntu. PS:依赖libevent,需要提前安装 yum install libevent-devel #centos中使用这个 apt-get install li ...
- python中列表元素连接方法join用法实例
python中列表元素连接方法join用法实例 这篇文章主要介绍了python中列表元素连接方法join用法,实例分析了Python中join方法的使用技巧,非常具有实用价值,分享给大家供大家参考. ...
随机推荐
- spark共享变量
boradcast例子代码: scala版本 spark共享变量之Accumulator 例子代码: scala版本
- HDU-5792 World is Exploding(树状数组)
题目大意:给一个整数序列,统计四元组(a,b,c,d)的个数,满足条件1:a<>b<>c<>d:条件2:<a,b>组成一个顺序对,<c,d> ...
- Analyzing The Papers Behind Facebook's Computer Vision Approach
Analyzing The Papers Behind Facebook's Computer Vision Approach Introduction You know that company c ...
- Machine and Deep Learning with Python
Machine and Deep Learning with Python Education Tutorials and courses Supervised learning superstiti ...
- JSBinding + SharpKit / Important Notes
Serialization of List<T> is not supported. 1 public int v; // SUPPORTED 2 public GameObject go ...
- Linux-内核缓存区和write行为
<Unix环境高级编程> 应用缓冲技术能很明显的提高系统效率.内核与外围设备的数据交换,内核与用户空间的数据交换都是比较费时的,使用缓冲区就是为了优化这些费时的操作.其实核心到用户空间的操 ...
- max_input_vars 的影响
一同事,让帮忙解决问题:post了1020条数据,结果只显示250条. 判断可能是php的post设置问题,结果发现php.ini里关于post的设置没有问题. 通过 php://input 得到请求 ...
- OkHttpUtils
对okhttp的封装类,okhttp见:https://github.com/square/okhttp.目前对应okhttp版本3.3.1. 用法: Android Studio compile ' ...
- Page cache和Buffer cache[转1]
http://www.cnblogs.com/mydomain/archive/2013/02/24/2924707.html Page cache实际上是针对文件系统的,是文件的缓存,在文件层面上的 ...
- Share Point 创建 TimerJob
public class SyncMetadataJob:SPJobDefinition { private const string JobName = @"Metadata Sync J ...