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

流过昼夜 提交于 2019-11-30 17:32:31

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

背景

公司将所有内网环境均从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证书的路径
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!