我正在编写一个简单的脚本,涉及CAS、jspring安全检查、重定向等。我想使用Kenneth Reitz的python请求,因为它是一个伟大的作品!然而,CAS需要通过SSL进行验证,所以我必须先通过这一步。我不知道Python请求想要什么?这个SSL证书应该驻留在哪里?

Traceback (most recent call last):
  File "./test.py", line 24, in <module>
  response = requests.get(url1, headers=headers)
  File "build/bdist.linux-x86_64/egg/requests/api.py", line 52, in get
  File "build/bdist.linux-x86_64/egg/requests/api.py", line 40, in request
  File "build/bdist.linux-x86_64/egg/requests/sessions.py", line 209, in request 
  File "build/bdist.linux-x86_64/egg/requests/models.py", line 624, in send
  File "build/bdist.linux-x86_64/egg/requests/models.py", line 300, in _build_response
  File "build/bdist.linux-x86_64/egg/requests/models.py", line 611, in send
requests.exceptions.SSLError: [Errno 1] _ssl.c:503: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

当前回答

有些服务器没有Letsencrypt的可信根证书。

例如,假设下面的url指向的服务器受到Letsencrypt SSL的保护。

requests.post(url, json=data)

此请求可能使用[SSL: CERTIFICATE_VERIFY_FAILED]失败,因为请求服务器没有Letsencrypt的根证书。

当发生这种情况时,请从下面的链接下载活动自签名的“pem”证书。

https://letsencrypt.org/certificates/。(在撰写本文时,ISRG根X1处于活动状态)

现在,在verify参数中使用它,如下所示。

requests.post(url, json=data, verify='path-to/isrgrootx1.pem')

其他回答

如果你不关心证书,使用verify=False即可。

import requests

url = "Write your url here"

returnResponse = requests.get(url, verify=False)

我也遇到了同样的问题。结果发现我没有在我的服务器上安装中间证书(只需将它附加到证书的底部,如下所示)。

https://www.digicert.com/ssl-support/pem-ssl-creation.htm

确保你已经安装了ca-certificates包:

sudo apt-get install ca-certificates

更新时间也可以解决这个问题:

sudo apt-get install ntpdate
sudo ntpdate -u ntp.ubuntu.com

如果您使用的是自签名证书,则可能需要手动将其添加到系统中。

经过几个小时的调试后,我只能使用以下包来工作:

requests[security]==2.7.0  # not 2.18.1
cryptography==1.9  # not 2.0

使用OpenSSL 1.0.2g 2016年3月1日

如果没有这些包,verify=False将无法工作。

我希望这能帮助到一些人。

如果请求调用隐藏在代码深处的某个地方,而你不想安装服务器证书,那么,仅用于调试目的,可以monkeypatch请求:

import requests.api
import warnings


def requestspatch(method, url, **kwargs):
    kwargs['verify'] = False
    return _origcall(method, url, **kwargs)

_origcall = requests.api.request
requests.api.request = requestspatch
warnings.warn('Patched requests: SSL verification disabled!')

永远不要在生产中使用!

目前请求模块中有一个问题导致此错误,出现在v2.6.2到v2.12.4 (ATOW)中:https://github.com/kennethreitz/requests/issues/2573

解决这个问题的方法是添加以下行:DEFAULT_CIPHERS = 'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!DSS的