当前位置: 首页 > 知识库问答 >
问题:

Python请求-如何使用系统ca证书(debian/ubuntu)?

周志文
2023-03-14

我已经将一个自签名的根ca证书安装到debian的/usr/share/ca证书/本地中,并使用sudo dpkg-reconfiure ca证书安装它们。此时,true|gnutls-climysite.local感到高兴,true|openssls_client连接mysite.local:443感到高兴,但是python2和python3请求模块坚持认为它对证书不满意。

蟒蛇2:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/requests/api.py", line 70, in get
    return request('get', url, params=params, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/requests/api.py", line 56, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/requests/sessions.py", line 488, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python2.7/site-packages/requests/sessions.py", line 609, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/requests/adapters.py", line 497, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",)

蟒蛇3

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/local/bin/python3.5/site-packages/requests/api.py", line 70, in get
    return request('get', url, params=params, **kwargs)
  File "/usr/local/bin/python3.5/site-packages/requests/api.py", line 56, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/local/bin/python3.5/site-packages/requests/sessions.py", line 488, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/bin/python3.5/site-packages/requests/sessions.py", line 609, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/bin/python3.5/site-packages/requests/adapters.py", line 497, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",)

共有3个答案

万知
2023-03-14

我的两分钱:

多亏了这个让我检查了实际请求代码的回答,我发现您不必使用env变量,只需在请求中设置“verify”参数即可:

requests.get("https://whatever", verify="/my/path/to/cacert.crt", ...)

它也有文档记录,尽管我只有在发现后才能找到文档(pypi项目指向doc的死链接):D

孔欣可
2023-03-14

我最近为此挣扎了一周左右。我终于找到了在Python中验证自签名或私人签名证书的方法。您需要创建自己的证书捆绑文件。无需在每次更新库或向系统证书存储区添加任何内容时更新晦涩的证书包。

首先运行之前运行的openssl命令,但添加-showcerts<代码>openssl s_客户端-连接mysite。local:443-showcerts这将为您提供一个长输出,在顶部您将看到整个证书链。通常,这意味着三个证书,即网站证书、中间证书和根证书。我们只需要将根证书和中间证书按相反的顺序放入下一个文件中。

将最后一个证书(根证书)复制到一个新的文本文件中。抓住中间的东西,包括:

-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

将中间证书(也称为中间证书)复制到根证书下的新文本文件中。再次抓取开始和结束证书行以及其间的所有内容。

将此文本文件保存到Python脚本所在的目录中。我建议称之为CertBundle。pem。(如果您给它一个不同的名称,或者将它放在文件夹结构的其他位置,请确保验证行反映了这一点。)更新脚本以引用新的证书捆绑包:

response = requests.post("https://www.example.com/", headers=headerContents, json=bodyContents, verify="CertBundle.pem")

就这样。如果您只有根证书或中间证书,那么Python无法验证整个证书链。但是,如果您在创建的证书捆绑包中同时包含这两个证书,那么Python可以验证中间证书是否由根用户签名,然后当它访问网站时,可以验证网站的证书是否由中间证书签名。

编辑:修复了证书捆绑包的文件扩展名。此外,修正了几个语法错误。

潘志国
2023-03-14

从https://stackoverflow.com/a/33717517/1695680

要使python请求使用系统ca证书捆绑包,需要告诉它通过自己的嵌入式捆绑包使用它

export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt

请求将其捆绑包嵌入此处,以供参考:

/usr/local/lib/python2.7/site-packages/requests/cacert.pem
/usr/lib/python3/dist-packages/requests/cacert.pem

或在较新版本中,使用附加程序包从以下位置获取证书:https://github.com/certifi/python-certifi

要验证从哪个文件加载证书,您可以尝试:

Python 3.8.5 (default, Jul 28 2020, 12:59:40) 
>>> import certifi
>>> certifi.where()
'/etc/ssl/certs/ca-certificates.crt'
 类似资料:
  • 问题内容: 我已经在debian’s中安装了一个自签名的root ca cert并使用安装了它们。在这一点上很高兴,也很高兴,但是python2和python3请求模块坚持认为对证书不满意。 python2: python3 为什么python会忽略系统ca-certificates捆绑包,以及如何集成它? 问题答案: 从http://codingdict.com/questions/664 为了

  • 在Android上安装系统CA证书 从Android 7开始,除非将应用程序配置为使用用户证书,否则它们将忽略用户证书。由于大多数应用程序未明确选择使用用户证书,因此我们需要将mitmproxy CA证书放置在系统证书存储中,以避免不得不打补丁我们要监视的每个应用程序。 请注意,应用程序可以决定忽略系统证书存储,并维护自己的CA证书。在这种情况下,您必须修补该应用程序。 1.先决条件 来自Andr

  • 这类似于将PEM导入Java密钥存储。但问题的答案是使用OpenSSL进行转换,并使用工具将其导入文件系统上的密钥存储。 我试图使用一个格式良好的X509证书作为信任锚: 当我试图运行该程序时,我得到一个错误: 我还尝试了

  • 问题内容: 我需要在公司Intranet上使用Curtom根证书,并将其加载到Mac OS TrustStore(KeyChain)中,才能解决所有浏览器和GUI应用程序的问题。 似乎它甚至可以与Mac OS X附带的版本一起使用,但 不适用于python ,甚至 不适 用于Mac OS 10.12 Sierra(Python 2.7.10)附带的版本。 不过,似乎我会受到: 我该如何解决? 因为

  • 我正尝试仅使用.NET代码创建证书请求,并将该请求提交给我们的前提Active Directory PKI证书颁发机构,然后取回证书。我有一个已经工作了几年的解决方案,但它使用了CERTCLILib和CERTENROLLLib,我希望摆脱这些依赖关系,并将此代码移植到.NET5。 然后将这些证书导入到Yubikey设备上。我们在Yubikey上生成密钥对,然后将公钥与CSR一起使用。 这里的问题使

  • 问题内容: 我有一台具有通过https运行的rest API的服务器。我想在我的应用程序中调用此rest api,该应用程序在不同的端口中运行,但是由于这是通过https进行的,因此 我有2个文件pulic_key.pem和private_key可用于验证证书。使用golang发送休假请求时如何验证证书?我正在发送休息请求。这就是我现在忽略证书的操作。 问题答案: 您需要将证书的CA添加到传输中,