问题描述
certifi
库通常会遇到域证书问题,但是在标准urllib.request
库中却没有问题。
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()))
如果我使用标准库并按如下所示设置上下文:
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))
没有SSL错误。
如何获得要求兑现此SSLContext
的请求?
解决方法
单独创建ssl.SSLContext()
不会启用证书验证或默认情况下加载CA证书。这就是为什么您没有看到SSL错误的原因。默认情况下,使用ssl.create_ssl_context()
会设置验证。
因此,这里的问题与SSLContext
或certifi
无关,而与网站的证书以及您如何构建SSLContext
有关。下一步将调查为什么网站提供的证书无效。