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

当前回答

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

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()))

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

其他回答

当它说验证需要“证书路径”时,我将其指向发行者证书,以便它可以使用该证书来验证url的证书。Curl和wget可以使用该证书。但不是python请求。

我必须为python请求创建一个包含从end (leaf?)到root的所有证书的证书链,才能很好地处理它。而且这个链很自然地与cURL和Wget一起工作。

希望它能帮助别人,节省几个小时。

这只是你可以尝试解决问题的另一种方式。

如果你输入“www.example.com”,requests就会对你大喊大叫。如果输入“https://www.example.com”,就会得到这个错误。因此,如果您不需要https,您可以通过将“https”更改为“http”来避免错误。如。“http://www.example.com”

警告:不使用HTTPS通常不是一个好主意。参见为什么HTTPS的一切?为什么HTTPS很重要

我为这个问题奋斗了好几个小时。

我尝试更新请求。然后我更新了证书。我将verify指向certificate .where()(代码在默认情况下这样做)。毫无效果。

最后,我将python版本更新到python 2.7.11。我使用的是Python 2.7.5,它与证书验证的方式有一些不兼容。一旦我更新了Python(以及一些其他依赖项),它就开始工作了。

如果要删除警告,请使用下面的代码。

import urllib3

urllib3.disable_warnings()

and verify=False与请求。Get或post方法

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