Python使用内部CA请求SSLError
我的公司为内部服务运营自己的内部CA,我需要访问hook-up Ansible AWX[python]与我们的一个内部服务对话,该服务使用由该CA签署的证书。基本上:Python使用内部CA请求SSLError,python,ssl,ansible,Python,Ssl,Ansible,我的公司为内部服务运营自己的内部CA,我需要访问hook-up Ansible AWX[python]与我们的一个内部服务对话,该服务使用由该CA签署的证书。基本上: AWX启动一个容器AWX\u任务,其中装入了/etc/pki/ca trust/source/anchors,其中包含根ca证书。[双重检查] 运行更新ca信任,将ca证书捆绑到各种东西中,包括/etc/pki/tls/certs/ca bundle.crt。[仔细检查] 请求应使用此捆绑包。我在容器内部或主机上找不到可以覆盖此内
AWX\u任务
,其中装入了/etc/pki/ca trust/source/anchors
,其中包含根ca证书。[双重检查]更新ca信任
,将ca证书捆绑到各种东西中,包括/etc/pki/tls/certs/ca bundle.crt
。[仔细检查]请求
应使用此捆绑包。我在容器内部或主机上找不到可以覆盖此内容的CA相关环境变量awx\u任务
内运行的Ansible play的测试运行时,我得到错误:
requests.exceptions.SSLError:HTTPSConnectionPool(host='vault.example.com',port=443):url:/(由SSLError(SSLError(1,u'[SSL:CERTIFICATE\u VERIFY\u FAILED]CERTIFICATE VERIFY FAILED(\u SSL.c:618'))引起)超过最大重试次数)
在主机上,我可以运行
import requests
requests.get("https://vault.example.com")
然后得到一个200
响应,如果我strace
进程,我可以看到它读取/etc/pki/tls/certs/ca bundle.crt
。但是从内部awx_task
我得到了与上面相同的请求.异常.SSLError
。不幸的是,Docker不让我在容器内运行strace,所以我看不到它试图读取的内容
但如果我将代码修改为:
import requests
requests.get("https://vault.example.com", verify="/etc/pki/tls/certs/ca-bundle.crt")
我从容器内部得到200
响应
我在这里遗漏了什么?问题在于@Will指出,当前版本的请求使用的是与OpenSSL完全分离的Certifi捆绑包。bundle PEM实际上位于Python站点包目录中的某个地方 在不修改代码的情况下,您可以使用环境变量覆盖此选项:
REQUESTS_CA_BUNDLE=/etc/pki/tls/certs/ca-bundle.crt
社论:这是一种绝对荒谬的强制CA信任的方式。如果您想降低系统信任度,请在系统级别降低信任度。我真的很讨厌追踪散布在源代码树中的随机PEM包(可能永远不会更新),仅仅因为一些Devops nutbag认为他比实际的操作更了解如何运行系统,并将他们的坏想法转移到毫无防备的系统
(ノಠ益ಠ)ノ彡┻━┻ 我以前见过类似的情况。请求使用嵌入式信任存储,这就是为什么您需要告诉它您的系统信任存储。