安云网 - AnYun.ORG | 专注于网络信息收集、网络数据分享、网络安全研究、网络各种猎奇八卦。
当前位置: 安云网 > 技术关注 > 编程茶楼 > Python > https(ssl)连接之python实现

https(ssl)连接之python实现

时间:2016-11-21来源:作者:安云网点击:
import urllib2 urllib2.urlopen( https://xxxx.com ) 本来这段代码很简单的,就是请求一个https的连接,可是报以下错误: ? 1 urllib2.URLError: 第一反应是https证书问题产生的,如是以python ssl 为关键字google后,看到大家都在用requests这个python组件做

import urllib2 //copyright AnYun.ORG

urllib2.urlopen('https://xxxx.com')

//ANYUN.ORG

本来这段代码很简单的,就是请求一个https的连接,可是报以下错误: //本文来自安云网

?

//ANYUN.ORG

1

//内容来自安云网

urllib2.URLError:

//安云网咨询系统

第一反应是https证书问题产生的,如是以'python ssl' 为关键字google后,看到大家都在用'requests'这个python组件做http请求客户端,就像java里面的httpclient组件一样,如果安装完request包后,改成如下代码: //ANYUN.ORG

?

//安云网咨询系统

1

//安云网咨询系统

2

//安云网,anyun.org

import requests //copyright AnYun.ORG

requests.get('https://xxx.com') //内容来自AnYun.ORG

 还是报以下错误:

//本文来自安云网

? //ANYUN.ORG

1 //copyright AnYun.ORG

requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:140773E8:SSL routines:SSL23_GET_SERVER_HELLO:reason(1000) //copyright AnYun.ORG

可以看出来,用requests和urllib2报的错误信息是一样,可见它们都是基于相同的底层api操作的,比如基于TLS的socket连接。到这里的时候我怀疑这个问题不是python代码写的有问题,可能是操作系统级别的设置错了。如下直接在shell客户端运行如下测试脚本: //内容来自AnYun.ORG

? //安云网咨询系统

1

//本文来自安云网

wget https://xxx.com //安云网,anyun.org

果然报如下错误:

//安云网,anyun.org

?

//copyright AnYun.ORG

1

//copyright AnYun.ORG

2 //内容来自安云网

OpenSSL: error:140773E8:SSL routines:SSL23_GET_SERVER_HELLO:reason(1000)

//ANYUN.ORG

无法建立 SSL 连接。 //本文来自安云网

到这里我怀疑是openssl安装有问题,更新到最新版本后还是一样,然后在浏览器里访问是可以的,所以应该不是openssl有问题。继续google.......,就发现有人也遇到过这种问题,说是连接SSL服务器时SSL的版本不对,如是用如下代码测试不同的SSL版本,看是不是这个问题:

//copyright AnYun.ORG

? //安云网,anyun.org

1

//安云网,anyun.org

2 //内容来自安云网

3

//本文来自安云网

4 //内容来自AnYun.ORG

5 //copyright AnYun.ORG

curl -1 https://xxx.com

//copyright AnYun.ORG

  //ANYUN.ORG

curl -2 https://xxx.com //本文来自安云网

 

//安云网,anyun.org

curl -3 https://xxx.com

//安云网咨询系统

分别用上面的三句脚本去测试连接情况,发现第三种可以连接正常(-1,2,3,数字分别代码tlsv1,sslv2,sslv3三个不同的SSL版本)。说明这个https连接所在的服务器是基于SSLV3版本的。找到的问题,就很容易知道怎么改写python代码了。

//本文来自安云网

?

//内容来自安云网

1 //copyright AnYun.ORG

2 //安云网咨询系统

3 //ANYUN.ORG

4 //内容来自安云网

5

//内容来自AnYun.ORG

6 //copyright AnYun.ORG

7

//内容来自AnYun.ORG

8 //内容来自AnYun.ORG

9 //copyright AnYun.ORG

class MyAdapter(HTTPAdapter): //内容来自AnYun.ORG

    def init_poolmanager(self, connections, maxsize):

//安云网咨询系统

        self.poolmanager= PoolManager(num_pools=connections,

//安云网咨询系统

            maxsize=maxsize, //内容来自AnYun.ORG

            ssl_version=ssl.PROTOCOL_SSLv3)

//内容来自AnYun.ORG

  //安云网咨询系统

s= requests.Session()

//内容来自AnYun.ORG

s.mount('https://', MyAdapter())#所有的https连接都用ssl.PROTOCOL_SSLV3去连接

//安云网咨询系统

s.get('https://xxx.com') //ANYUN.ORG

urllib2实现: //ANYUN.ORG

? //安云网咨询系统

1

//ANYUN.ORG

2

//copyright AnYun.ORG

3

//内容来自安云网

4 //内容来自AnYun.ORG

5

//本文来自安云网

6 //安云网咨询系统

7

//安云网咨询系统

8 //本文来自安云网

9

//安云网咨询系统

10

//内容来自AnYun.ORG

11

//内容来自安云网

12 //内容来自AnYun.ORG

13 //内容来自安云网

14 //本文来自安云网

15

//内容来自安云网

16 //内容来自安云网

17 //内容来自AnYun.ORG

18 //copyright AnYun.ORG

19 //copyright AnYun.ORG

20 //本文来自安云网

21 //copyright AnYun.ORG

22

//内容来自AnYun.ORG

23 //本文来自安云网

24

//安云网咨询系统

25 //copyright AnYun.ORG

26 //copyright AnYun.ORG

# custom HTTPS opener, banner's oracle 10g server supports SSLv3 only //安云网咨询系统

import httplib, ssl, urllib2, socket //内容来自安云网

class HTTPSConnectionV3(httplib.HTTPSConnection):

//安云网,anyun.org

    def __init__(self,*args,**kwargs): //内容来自安云网

        httplib.HTTPSConnection.__init__(self,*args,**kwargs) //内容来自AnYun.ORG

         

//ANYUN.ORG

    def connect(self):

//内容来自AnYun.ORG

        sock= socket.create_connection((self.host,self.port),self.timeout) //内容来自安云网

        if self._tunnel_host: //copyright AnYun.ORG

            self.sock= sock

//本文来自安云网

            self._tunnel() //安云网咨询系统

        try: //内容来自AnYun.ORG

            self.sock= ssl.wrap_socket(sock,self.key_file,self.cert_file, ssl_version=ssl.PROTOCOL_SSLv3)

//本文来自安云网

        except ssl.SSLError, e: //copyright AnYun.ORG

            print("Trying SSLv3.") //内容来自安云网

            self.sock= ssl.wrap_socket(sock,self.key_file,self.cert_file, ssl_version=ssl.PROTOCOL_SSLv23) //安云网,anyun.org

             

//copyright AnYun.ORG

class HTTPSHandlerV3(urllib2.HTTPSHandler): //内容来自安云网

    def https_open(self, req):

//copyright AnYun.ORG

        return self.do_open(HTTPSConnectionV3, req) //内容来自AnYun.ORG

# install opener

//安云网咨询系统

urllib2.install_opener(urllib2.build_opener(HTTPSHandlerV3()))

//安云网,anyun.org

 

//本文来自安云网

if __name__== "__main__":

//copyright AnYun.ORG

    r= urllib2.urlopen("https://ui2web1.apps.uillinois.edu/BANPROD1/bwskfcls.P_GetCrse")

//ANYUN.ORG

    print(r.read()) //ANYUN.ORG

可以看到这两种方案的原理都是一样,就是自定义连接处理器,改变连接时ssl的版本号。

//安云网,anyun.org

参考文章:http://bugs.python.org/issue11220

//内容来自安云网

              https://github.com/kennethreitz/requests/issues/606

//安云网,anyun.org


//ANYUN.ORG

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
验证码: 点击我更换图片
相关内容
推荐内容