python发送http请求时遇到:error 54, 'Connection reset by peer' 解决方法

python发送http请求时遇到:error 54, 'Connection reset by peer' 解决方法

  • 背景
    • 原因
    • 重点
    • 解决方法
    • 采取证书内嵌代码可节省每台机器都手动安装ca的烦恼

背景

公司将所有内网环境均从http访问更换为https访问,需要下发自制的ca【Certificate Authority】到所有访问内网环境的机器上以便登陆内网环境。
当遇到需要向服务端发送http请求,获取一些数据的时候报错’Connection reset by peer’。代码如下:

f_path = '/tmp/ca.cert.pem'

def add_ca():
    # 导入ca证书
    f = open(f_path, 'w+')
    ca = "-----BEGIN CERTIFICATE-----xxxxx-----END CERTIFICATE-----"
    f.writelines(ca)

url = 'https://jira.xx.local/rest/api/2/search'
res = requests.post(url, json=text, headers={"Authorization": "xxxx"}, verify=f_path)

原因

OpenSSL 这个库太老了。不兼容你要请求的网址。

重点

如果系统同时安装了多个版本的python,请查看你的代码采用的是python是哪个版本再采取解决方法。

解决方法

  1. 最好的办法:直接升级python到2.7.x及以上,会解决此问题。
  2. 如果不想升级python的话,可以用:pip install requests[security]
  3. 另一种已过时的方法:pip install pyopenssl ndg-httpsclient pyasn1

采取证书内嵌代码可节省每台机器都手动安装ca的烦恼

def add_ca():
    # 导入ca证书
    f = open(f_path, 'w+')
    ca = "-----BEGIN CERTIFICATE----------END CERTIFICATE-----"
    f.writelines(ca)

并在发送http请求时强制指定此ca证书:

 res = requests.post(url, json=text, headers={"Authorization": "xxxxx"},verify=f_path)
 #f_path是ca证书的路径

你可能感兴趣的:(测试)