我的公司为内部服务运营自己的内部CA,我需要访问连接Ansible AWX [python]才能与使用此CA签名的证书的内部服务进行对话。基本上:
awx_task
的容器/etc/pki/ca-trust/source/anchors
,该容器包含根CA证书。 [仔细检查] update-ca-trust
被运行,将CA证书捆绑到各种事物中,包括/etc/pki/tls/certs/ca-bundle.crt
。 [仔细检查] requests
应该使用此捆绑软件。在容器内部或主机上找不到与CA相关的环境变量,可以对此进行覆盖。但是,当我触发在awx_task
内运行的Ansible剧本的测试运行时,出现错误:
requests.exceptions.SSLError:HTTPSConnectionPool(host ='vault.example.com',port = 443):URL超过最大重试次数:/(由SSLError(SSLError(1,u'[SSL: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
响应。
我在这里想念什么?
答案 0 :(得分:1)
问题是@Will所指出的,当前版本的Requests使用与OpenSSL完全分开的Certifi捆绑包。捆绑包PEM实际上位于您的Python网站包目录中。
无需修改代码,您可以使用环境变量覆盖它:
REQUESTS_CA_BUNDLE=/etc/pki/tls/certs/ca-bundle.crt
编辑:这是强制执行CA信任的绝对荒谬方式。如果要减少系统信任,请在系统级别减少它。我真的很讨厌追逐散布在源代码树中的随机PEM软件包(可能永远不会更新),只是因为某些 #devoops nutbag认为他知道如何比实际操作更好地运行系统并分叉它们对毫无戒心的系统提出了错误的想法。
(ノಠ益ಠ)ノ彡┻━┻