微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

获取与urlopen一起使用的urllib.requests证书包

如何解决获取与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告诉urllib3DEFAULT_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 举报,一经查实,本站将立刻删除。