如何解决获取与urlopen一起使用的urllib.requests证书包
我在Windows上,并且在调用同一站点时看到urllib.requests.urlopen和请求包之间的区别。
当我执行以下操作时:
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
上使用它?
解决方法
您是否可以选择使用服务器证书获取.pem文件?
.replaceAll(/'/g,"\u2019")
.replaceAll(/"/g,"\u201d")
在Windows上使用ssl.enum_certificates来加载证书。因此,证书是从Windows服务获得的。
获得证书文件后,请在通话urlopen
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")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。