我在windows上,当我调用同一站点时,我看到了urllib.requests.urlopen和requests package之间的区别。
当我执行以下操作时:
import urllib.request
f = urllib.request.urlopen('https://<domain certificated server> ')我可以毫无问题地连接到我的服务器。
当我这样做的时候:
import requests
f = requests.get('https://<domain certificated server> ').text我收到一个SSL证书错误。我知道这是由certifi引起的。所以我的问题是,我如何利用Python代码正在做的事情,并在请求中通过certifi使用它?
发布于 2020-10-21 20:52:57
您是否可以选择获取包含服务器证书的.pem文件?
urlopen正在使用windows上的ssl.enum_certificates加载证书。因此,证书是从windows服务获得的。
获得证书文件后,在您的call requests.get('<server.internal>', verify='/path/to/certfile')上使用它
发布于 2020-10-22 15:01:35
simple way告诉requests使用系统包,如果您知道它在哪里的话。在Linux上,它通常在/etc/ssl/certs/ca-certificates.crt中。
requests.get('<server.internal>', verify='/etc/ssl/certs/ca-certificates.crt')如果您在Windows上,不知道系统包的位置,或者只想支持所有情况,您也可以定义自己的适配器。default adapter告诉urllib3从DEFAULT_CA_BUNDLE_PATH加载证书,该证书来自调用certifi.where()。如果你不告诉urllib3到哪里去获取证书,它就会use the system default。
import requests
import requests.adapters
class SysCertsHTTPAdapter(requests.adapters.HTTPAdapter):
def cert_verify(self, conn, url, verify, cert):
# require verification, but use system defaults
# default requests implementation sets conn.ca_certs and/or conn.ca_cert_dir
conn.cert_reqs = 'CERT_REQUIRED'
session = requests.Session()
session.mount('https://', SysCertsHTTPAdapter())
session.get("https://google.com")https://stackoverflow.com/questions/64284595
复制相似问题