Python SSL错误CERTIFICATE_VERIFY_FAILED

时间:2017-08-31 20:32:48

标签: python ssl

我对学校网站的请求有疑问。我在网上搜索了解决方案,但没有一个适合我。我已经通过pip安装了certifi,它不起作用。我重新安装了openssl,但它没有用。

>>> import ssl
>>> ssl.OPENSSL_VERSION
'OpenSSL 1.0.2l  25 May 2017'

具体来说,SSL验证是这里的问题。我可以使用我的浏览器正确打开网页,而不会发出任何SSL警告,但我无法使用Python。

那么,接下来我该怎么办?希望有人可以给我一些建议。非常感谢

1 个答案:

答案 0 :(得分:2)

阅读Python的requests docs

我发现了以下内容:

  

当您使用准备好的请求流程时,请记住它   没有考虑到环境。如果这可能会导致问题   您正在使用环境变量来改变行为   要求。例如:自签名SSL 证书   REQUESTS_CA_BUNDLE不会被考虑在内。结果一个   SSL: CERTIFICATE_VERIFY_FAILED被抛出。你可以解决这个问题   通过明确的行为将环境设置合并到您的   会话:

from requests import Request, Session

s = Session()
req = Request('GET', url)

prepped = s.prepare_request(req)

# Merge environment settings into session
settings = s.merge_environment_settings(prepped.url, None, None, None, None)
resp = s.send(prepped, **settings)

print(resp.status_code)

我建议您阅读文档,因为我刚刚引用了原始文档的一部分。

除此之外,

  

请求验证HTTPS请求的SSL证书,就像Web一样   浏览器。默认情况下,启用SSL验证,请求将启用   如果无法验证证书,则抛出SSLError。

您可以使用verify参数提供具有可信CA证书的CA_BUNDLE文件或目录的路径:

>>> requests.get('https://your-school-website-url.com', verify='/path/to/cacert_file')
如果您将Requests设置为verify

False也可以忽略验证 SSL证书

>>> requests.get('https://kennethreitz.org', verify=False)
<Response [200]>

默认情况下verify设置为True。选项验证仅适用于主机证书。

再次,请阅读docs

希望有所帮助!