Python请求出现“证书验证失败”问题

15

我正在维护一个使用requests和HTTPS的Python小应用程序。

这个应用程序一直正常工作,直到HTTPS URL中主机名的IP地址发生了更改(合法的)。如果我在浏览器中输入URL,我仍然可以成功检索它。

Python/requests保存ssh's known_hosts的类似物在哪里?如何清除该主机的记录?

$ python --version
Python 2.7.3

$ cat foo.py 
import requests
url = "https://somehost/resource.json"
requests.get(url, timeout=5, config={'danger_mode': True})

$ source venv/bin/activate
$ python foo.py 
Traceback (most recent call last):
  File "foo.py", line 3, in <module>
    requests.get(url, timeout=5, config={'danger_mode': True})
  File "/home/dfukdev/corsair-scripts/alfred/venv/local/lib/python2.7/site-packages/requests/api.py", line 65, in get
return request('get', url, **kwargs)
  File "/home/dfukdev/corsair-scripts/alfred/venv/local/lib/python2.7/site-packages/requests/safe_mode.py", line 39, in wrapped
return function(method, url, **kwargs)
  File "/home/dfukdev/corsair-scripts/alfred/venv/local/lib/python2.7/site-packages/requests/api.py", line 51, in request
return session.request(method=method, url=url, **kwargs)
  File "/home/dfukdev/corsair-scripts/alfred/venv/local/lib/python2.7/site-packages/requests/sessions.py", line 241, in request
r.send(prefetch=prefetch)
  File "/home/dfukdev/corsair-scripts/alfred/venv/local/lib/python2.7/site-packages/requests/models.py", line 641, in send
raise SSLError(e)
requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14090086:SSL     routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

5
我不确定为什么证书无效,但是你可以使用“requests.get(url,timeout=5,config = {'danger_mode': True},verify=False)”作为解决方法来忽略SSL证书。在Requests高级用法文档中提到。 - user2629998
1
@AndréDaniel 那个 config 已经被移除了吗?我在链接的页面上没有看到它,而我的 Python 却声称它是未知的。而仅仅使用 verify=False 似乎并不能解决问题... - codeling
@RandolphCarter,我刚刚查看了页面,它仍然存在,请搜索“SSL证书”(我很想给你一个直接链接,但我现在正在使用手机,无法这样做)... - user2629998
2
@AndréDaniel 噢,是的,Verify 还在。我在脚本中漏了一个第二个reqeuests.get语句,也引发了该错误。然而,config={'danger_mode': True} 不再需要 - 如果我正确地阅读了这个,现在它已经成为默认设置了。感谢你如闪电般快速的回复! - codeling
3个回答

6

您正在使用一个古老的requests版本。如果升级到2.0,您将获得更有用的信息,如果您的网站存在证书不匹配问题,则可以通过指定系统证书来修复它,这将能够验证中间证书。您也可以像Andre建议的那样不进行证书验证。


1
事实证明,在服务器升级过程中安装了未签名或错误签名的证书。由于两个操作系统之间根证书的差异,因此从 Windows 机器上在浏览器中使用 HTTPS 是可以工作的。IP 变更与此关系不大(除了让事情变得更加混乱)。 - Garrett Smith

2
在问题提到的服务器升级期间,安装了一个签名不正确的证书。由于Windows浏览器机器和Ubuntu Python客户端之间的根证书差异,浏览器中的HTTPS可以正常工作。从在Python运行的同一台Ubuntu机器上使用浏览器的HTTPS揭示了证书问题的详细信息。IP更改与问题几乎无关,只会使事情更加混乱。
将我的评论提升为答案,原因如下:
  1. 这回答了我的问题
  2. 这个问题已经有足够的流量,我想分享这个知识。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接