我正在编写一个简单的脚本,涉及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

当前回答

对我来说,原因相当微不足道。

直到几天前,我才知道SSL验证工作正常,实际上是在另一台机器上工作。

我的下一步是比较正在进行验证的机器和没有进行验证的机器之间的证书内容和大小。

这很快导致我确定在“不正确”工作的机器上的证书并不好,一旦我用“良好”证书替换它,一切都很好。

其他回答

我找到了一个解决问题的答案:

import ssl
import certifi
import urllib.request

url = "https://www.google.com/"
html = urllib.request.urlopen(url, context=ssl.create_default_context(cafile=certifi.where()))

但我不知道它是干什么用的。

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

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

使用OpenSSL 1.0.2g 2016年3月1日

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

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

目前请求模块中有一个问题导致此错误,出现在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的

正如其他人指出的那样,这个问题“是由不受信任的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。

您遇到的问题是由不受信任的SSL证书引起的。

就像之前的评论中提到的@dirk一样,最快的修复方法是设置verify=False:

requests.get('https://example.com', verify=False)

请注意,这将导致无法验证证书。这将使您的应用程序面临安全风险,例如中间人攻击。

当然,要有判断力。正如评论中提到的,这对于快速/一次性应用程序/脚本可能是可以接受的,但真的不应该用于生产软件。

如果仅仅跳过证书检查在您的特定上下文中是不可接受的,请考虑以下选项,最好的选项是将verify参数设置为一个字符串,该字符串是证书的.pem文件的路径(您应该通过某种安全方法获取该文件)。

因此,从2.0版本开始,verify形参接受以下值,并具有各自的语义:

True:使证书针对库自己的受信任证书颁发机构进行验证(注意:您可以通过Certifi库查看请求使用的根证书,Certifi库是从Requests: Certifi - trust database for Humans中提取的rc的信任数据库)。 False:完全跳过证书验证。 请求用来验证证书的CA_BUNDLE文件的路径。

来源:请求- SSL证书验证

还可以查看同一链接上的cert参数。