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

当前回答

我在使用aws boto3时遇到了同样的问题和ssl证书验证失败的问题,通过检查boto3代码,我发现没有设置REQUESTS_CA_BUNDLE,所以我通过手动设置来修复这两个问题:

from boto3.session import Session
import os

# debian
os.environ['REQUESTS_CA_BUNDLE'] = os.path.join(
    '/etc/ssl/certs/',
    'ca-certificates.crt')
# centos
#   'ca-bundle.crt')

对于aws-cli,我想在~/中设置REQUESTS_CA_BUNDLE。Bashrc将修复这个问题(没有测试,因为我的aws-cli没有它也能工作)。

REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt # ca-bundle.crt
export REQUESTS_CA_BUNDLE

其他回答

要使用的CA文件的名称可以通过验证:

cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
r = requests.get(url, verify=cafile)

如果使用verify=True,则requests使用自己的CA集,该CA集可能没有签署您的服务器证书的CA。

$ pip install -U requests[security]

在Python 2.7.6 @ Ubuntu 14.04.4 LTS上测试 在Python 2.7.5 @ MacOSX 10.9.5上测试(Mavericks)

当这个问题被打开时(2012-05),请求版本是0.13.1。在2.4.1版本(2014-09)中引入了“安全”额外功能,如果可用,则使用certifi包。

目前(2016-09)的主要版本是2.11.1,没有verify=False也能正常工作。不需要使用请求。get(url, verify=False),如果安装了请求[安全]额外。

您遇到的问题是由不受信任的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参数。

如果从另一个包调用请求,则添加选项是不可行的。在这种情况下,将证书添加到cacert包是直接的路径,例如,我必须添加“StartComClass1 Primary Intermediate Server CA”,为此我将根证书下载到StartComClass1.pem中。鉴于我的virtualenv被命名为caldav,我添加了证书:

cat StartComClass1.pem >> .virtualenvs/caldav/lib/python2.7/site-packages/pip/_vendor/requests/cacert.pem
cat temp/StartComClass1.pem >> .virtualenvs/caldav/lib/python2.7/site-packages/requests/cacert.pem

其中一个可能就够了,我没有检查

正如@Rafael Almeida所提到的,您遇到的问题是由不受信任的SSL证书引起的。在我的例子中,我的服务器不信任SSL证书。为了在不影响安全性的情况下解决这个问题,我下载了证书,并将其安装到服务器上(只需双击.crt文件,然后安装证书…)。