我正在编写一个简单的脚本,涉及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
我也遇到了同样的问题。结果发现我没有在我的服务器上安装中间证书(只需将它附加到证书的底部,如下所示)。
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
如果您使用的是自签名证书,则可能需要手动将其添加到系统中。
我找到了一个解决类似问题的具体方法。这个想法是指向存储在系统中的cacert文件,并由另一个基于ssl的应用程序使用。
在Debian中(我不确定在其他发行版中是否相同),证书文件(.pem)存储在/etc/ssl/certs/所以,这是为我工作的代码:
import requests
verify='/etc/ssl/certs/cacert.org.pem'
response = requests.get('https://lists.cacert.org', verify=verify)
为了猜测pem文件的选择,我已经浏览到url并检查哪个证书颁发机构(CA)生成了证书。
编辑:如果你不能编辑代码(因为你正在运行第三个应用程序),你可以尝试直接将pem证书添加到/usr/local/lib/python2.7/dist-packages/requests/cacert。Pem(例如将其复制到文件的末尾)。
正如其他人指出的那样,这个问题“是由不受信任的SSL证书引起的”。我的答案是基于评分最高的答案和这个答案。
您可以使用curl测试证书:
curl -vvI https://example.com
如果一个错误返回,你有3个选项:
为了快速修复,您可以不验证证书:
requests.get('https://example.com', verify=False)
将路径传递给CA_BUNDLE文件或包含受信任ca证书的目录:
requests.get('https://example.com', verify='/path/to/certfile')
如果您有权访问,请修复web服务器证书。
我的问题在于我只使用了我站点的证书,而不是中间证书(也就是链证书)。
如果你正在使用Let's Encrypt,你应该使用全链。Pem文件,而不是cert.pem。