如何将 SSLContext 与 Python 请求库一起使用?

Jab*_*ber 7 urllib3 python-3.x python-requests

certifi库经常遇到域证书问题,但在标准urllib.request库中没有问题。

如果我将上下文设置为使用证书文件,则会收到 SSL 错误,

import ssl
import certifi
import requests.urllib as urlrq

resp = urlrq.urlopen(url="https://<web address>/rest/info?f=json", 
                                  context=ssl.create_default_context(cafile=certifi.where()))
Run Code Online (Sandbox Code Playgroud)

如果我使用标准库并设置上下文如下:

import ssl
import certifi
import requests.urllib as urlrq

resp = urlrq.urlopen(url="https://<web address>/rest/info?f=json", 
                                  context=ssl.SSLContext(ssl.PROTOCOL_TLSv1))
Run Code Online (Sandbox Code Playgroud)

没有 SSL 错误。

我怎样才能收到尊重这一点的请求SSLContext

set*_*son 1

默认情况下,单独创建ssl.SSLContext()不会启用证书验证或加载 CA 证书。这就是您没有看到 SSL 错误的原因。默认情况下使用ssl.create_ssl_context()确实设置验证。

因此,这里的问题不在于SSLContextcertifi,而在于网站的证书以及您如何构建SSLContext. 下一步是调查为什么网站提供的证书无效。

  • 来自请求的确切错误消息:(由 SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败 (_ssl.c:852)' 引起), (2认同)