Python中HTTPS连接

本文介绍了一种在Python中遇到的特定SSL版本不兼容问题及其解决方案。通过使用curl测试不同SSL版本并确定目标服务器所支持的版本,最终通过自定义连接处理器修改Python请求的SSL版本来解决问题。

今天写代码时碰到一个问题,花了几个小时的时间google,


首先需要安装openssl,更新到最新版本后,在浏览器里看是否可访问,如果是可以的,所以应该不是openssl有问题。

然后使用 curl尝试访问

curl -v 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

 

连接到Elasticsearch服务通常需要配置客户端以确保安全性和兼容性,特别是在使用HTTPS协议时。Elasticsearch的Python客户端提供了多种配置选项来支持HTTPS连接。 ### 基本HTTPS连接 对于基本的HTTPS连接,如果Elasticsearch集群启用了SSL/TLS加密,但不需要客户端证书验证,可以简单地通过设置`use_ssl=True`参数来启用HTTPS。此外,为了确保连接的安全性,建议同时设置`verify_certs=True`以启用证书验证。这要求客户端信任Elasticsearch服务器的SSL证书,无论是通过CA签名的证书还是自签名证书的手动添加。 ```python from elasticsearch import Elasticsearch es = Elasticsearch( hosts=[{'host': 'localhost', 'port': 9200}], use_ssl=True, verify_certs=True ) print(es.info()) ``` ### 使用自签名证书 如果使用的是自签名证书,或者证书颁发机构不在操作系统的信任库中,则需要提供一个CA证书文件路径或目录,以便客户端能够验证Elasticsearch服务器的身份。这可以通过`ca_certs`参数指定CA证书的位置实现。 ```python es = Elasticsearch( hosts=[{'host': 'localhost', 'port': 9200}], use_ssl=True, verify_certs=True, ca_certs='/path/to/cacert.pem' ) print(es.info()) ``` ### 客户端证书认证 当Elasticsearch配置为要求客户端证书认证时,除了服务器端的证书验证外,还需要向客户端提供自己的证书和私钥。这可以通过`client_cert`和`client_key`参数完成,分别指向客户端证书文件和私钥文件的位置。 ```python es = Elasticsearch( hosts=[{'host': 'localhost', 'port': 9200}], use_ssl=True, verify_certs=True, client_cert='/path/to/client.crt', client_key='/path/to/client.key' ) print(es.info()) ``` ### IAM认证(AWS环境) 在AWS环境中,如果Elasticsearch服务配置了IAM角色认证,可以利用`requests-aws4auth`包来处理签名过程。这种方式允许使用AWS访问密钥对请求进行签名,从而实现对Elasticsearch服务的身份验证。 ```python from elasticsearch import Elasticsearch, RequestsHttpConnection from requests_aws4auth import AWS4Auth host = 'your-host.us-east-1.es.amazonaws.com' awsauth = AWS4Auth('YOUR_ACCESS_KEY', 'YOUR_SECRET_KEY', 'REGION', 'es') es = Elasticsearch( hosts=[{'host': host, 'port': 443}], http_auth=awsauth, use_ssl=True, verify_certs=True, connection_class=RequestsHttpConnection ) print(es.info()) # 输出Elasticsearch的信息,确认连接成功 ``` 以上示例展示了如何根据不同的安全需求配置Python客户端以通过HTTPS连接到Elasticsearch服务。确保在实际部署时根据具体的环境和安全策略调整这些配置参数[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值