Python使用内部CA请求SSLError

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。[仔细检查] 请求应使用此捆绑包。我在容器内部或主机上找不到可以覆盖此内

我的公司为内部服务运营自己的内部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
    。[仔细检查]
  • 请求
    应使用此捆绑包。我在容器内部或主机上找不到可以覆盖此内容的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认为他比实际的操作更了解如何运行系统,并将他们的坏想法转移到毫无防备的系统


    (ノಠ益ಠ)ノ彡┻━┻

    我以前见过类似的情况。请求使用嵌入式信任存储,这就是为什么您需要告诉它您的系统信任存储。