gpt4 book ai didi

Python 请求内部 CA 的 SSLError

转载 作者:太空宇宙 更新时间:2023-11-03 11:37:27 27 4
gpt4 key购买 nike

我的公司为内部服务运营自己的内部 CA,我需要访问连接 Ansible AWX [python] 以与我们使用由该 CA 签署的证书的内部服务之一对话。基本上:

  1. AWX 启动一个容器 awx_task,其中安装了 /etc/pki/ca-trust/source/anchors,其中包含根 CA 证书。 [双重检查]
  2. update-ca-trust 运行,将 CA 证书捆绑到各种东西中,包括 /etc/pki/tls/certs/ca-bundle.crt。 [双重检查]
  3. 请求 应该 使用这个包。我在容器内或主机上找不到可以覆盖它的与 CA 相关的环境变量。

但是,当我触发在 awx_task 中运行的 Ansible play 的测试运行时,我收到错误:

requests.exceptions.SSLError: HTTPSConnectionPool(host='vault.example.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:618)'),))

在主机上我可以运行

import requests
requests.get("https://vault.example.com")

并获得 200 响应,如果我 strace 过程,我可以看到它正在读取 /etc/pki/tls/certs/ca-bundle。 crt。但是从 awx_task 内部,我得到了与上面相同的 requests.exceptions.SSLError。不幸的是,Docker 不允许我在容器内运行 strace,所以我看不到它试图读取的内容。

但是如果我将代码修改为:

import requests
requests.get("https://vault.example.com", verify="/etc/pki/tls/certs/ca-bundle.crt")

我从容器内部收到一个 200 响应。

我在这里错过了什么?

最佳答案

问题是@Will 指出的,当前版本的 Requests 使用完全独立于 OpenSSL 的 Certifi 包。 bundle PEM 实际上位于您的 Python 站点包目录中的某个位置。

无需修改您的代码,您可以使用环境变量覆盖它:

REQUESTS_CA_BUNDLE=/etc/pki/tls/certs/ca-bundle.crt

社论:这是执行 CA 信任的绝对荒谬的方式。如果您想减少系统信任,请在系统级别减少它。我真的厌倦了追逐分散在源代码树中的随机 PEM 包 [可能永远不会更新] 只是因为一些 #devoops 疯子认为他知道如何比实际操作更好地运行系统并 fork 他们的毫无戒心的系统的坏主意。

(ノಠ益ಠ)ノ彡┻━┻

关于Python 请求内部 CA 的 SSLError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56332517/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com