【问题标题】:Ansible URI module with cacert option带有 cacert 选项的 Ansible URI 模块
【发布时间】:2017-12-19 15:38:48
【问题描述】:

我正在尝试做相当于:

curl -X POST --data <json> --key <path to key> --cert <path to cert> --cacert <path to cacert> --header "Content-Type: application/json" <url>

在一个可靠的游戏中。根据http://docs.ansible.com/ansible/latest/uri_module.html 的文档,有密钥、证书、X、标头和数据的等效项,但我还没有找到传递证书颁发机构文件的方法。

我试过了:

environment:
  CURL_CA_BUNDLE: <path to cacert>
uri:
  url: <url>
  client_cert: <path to cert>
  client_key: <path to key>
  body: <json>
  method: POST
  body_format: json

由于 man curl 指定它将读取环境变量CURL_CA_BUNDLE。我也试过:

uri:
  url: <url>
  client_cert: <path to cert>
  client_key: <path to key>
  body: <json>
  method: POST
  body_format: json
  others: --cacert <path to cacert>

这两种方法都没有奏效。如果没有 cacert,我会收到错误消息:“无法验证 &lt;url&gt; 的 SSL 证书。请确保您的托管系统安装了有效的 CA 证书...”。我知道如果我传入validate_certs=False,那么该方法将起作用,并且我知道它可以通过带有curl的命令行起作用。

是否有其他选项可以传入 URI 模块来绕过此问题?

【问题讨论】:

    标签: ssl curl ansible


    【解决方案1】:

    uri module 不是 cURL,它是完整的 python 实现。因此,cURL env-vars 或选项不可能起作用。
    others 选项被记录为“文件模块接受的所有参数也在这里工作”,所以它只是意味着你可以使用ownergroupmode 等来设置dest 的属性.

    client_certclient_key 在最近的 2.4 中被添加只是为了修复 issue #18141 并且他们没有考虑服务器 TLS 身份验证...

    我可以看到 3 个解决方案:

    • 将 CA 证书添加到系统证书中(在 uri 任务的目标主机上)-仅适用于 python >= 2.7.9
    • 使用 validate_certs: no 选项禁用服务器证书验证(因此无需使用 CA 证书)
    • 提出问题(也可能是 PR)以添加对 cacert 选项的支持

    【讨论】:

    • 只是添加一些注释,我在 /etc/pki/tls/certs 中安装了 CA 证书,并且 ansible 确实在挑选它们。我真正的问题是我运行的是 Python 2.7.5,并且在 Python 2.7.9 中添加了对 CA 的支持(请参阅docs.python.org/2/library/urllib2.html)。我认为我可以选择为 URI 模块添加 cacert 文件/目录将是一个很好的补充,所以我会尝试在某个时候提交问题。
    • 你得到解决方案了吗?
    • @IndraYadav 是的,它确实适用于validate_certs: no
    • 请注意,您正在使用validate_certs: no 切换到不安全模式。
    • 关于“将 CA 证书添加到系统证书中”:关于如何在 macOS 上执行此操作的任何想法?
    【解决方案2】:

    在任务级别使用SSL_CERT_FILE 环境变量。前任务:

    - name: test uri using a custom cacert file
      environment:
        SSL_CERT_FILE: "{{ cacert_file_path }}"
      uri:
        url: "{{ uri_url }}"
    

    【讨论】:

      【解决方案3】:

      首先,禁用 SSL 证书验证不是一种解决方案,而是一种解决方法。其次,SSL_CERT_FILE 的路径因您的 Linux 发行版而异。这是一个让 Ansible 模块(Python)在 Debian 发行版中识别 SSL 证书的示例,这在我的情况下是有效的。

      (我知道问题是关于 uri 模块,但该解决方案应该适用于 Ansible 模块)


      更新证书包后,例如update-ca-certificates

      - name:a task
        get_url:
          url: <url>
          dest: <dest>
        environment:        # Specify SSL cert bundle here. 
          SSL_CERT_FILE: /etc/ssl/certs/ca-certificates.crt
      

      【讨论】:

        【解决方案4】:

        拉取请求https://github.com/ansible/ansible/pull/71979uri 模块添加了ca_path 参数,该参数允许指定包含用于验证的CA 证书的文件(请参阅https://docs.ansible.com/ansible/latest/collections/ansible/builtin/uri_module.html#parameter-ca_path)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多