Ansible uri模块和双向TLS

似乎有一个问题让uri模块很好地处理出入境TLS。 我已经设法让客户端验证或服务器验证工作,但不同时,这似乎很奇怪。 旋度相同的安装工作没有问题,如下显示。 如果你有一些经验与uri模块和TLS,也许你可以帮助。

设置

我有设置Apache httpd接受TLS连接主机,自签署的根证书,一个中间CA证书,一个服务器证书签发给127.0.0.1,客户机证书。我可以用旋度测试这个设置,和,一切工作正常,见下文。

文件host.127.0.0.1.cert。 pem包含三个证书:根,中间,和服务器证书。 文件ca.chain。 pem包含两个证书:根和中间。 文件client.SomeUser.cert。 pem包含一个证书:客户端证书

正如你所看到的从下面的输出,我运行python version = 3.7.0

从httpd . conf:

Listen 443
<VirtualHost *:443>
ServerName 127.0.0.1
SSLEngine on
SSLCertificateFile "/path/to/host.127.0.0.1.cert.pem"
SSLCertificateKeyFile "/path/to/host.127.0.0.1.privkey.nopass.pem"
SSLVerifyClient require
SSLVerifyDepth 2
SSLCACertificateFile "/path/to/ca.chain.pem"
</VirtualHost>
测试与旋度的设置

cURL命令和输出:

$ curl -vvv --cert client.SomeUser.cert.pem --key client.SomeUser.privkey.pem --cacert ca.chain.pem -X GET https://127.0.0.1

  • Connected to 127.0.0.1 (127.0.0.1) port 443 (#0)
  • ALPN, offering h2
  • ALPN, offering http/1.1
    Enter PEM pass phrase:
  • Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
  • successfully set certificate verify locations:
  • CAfile: /Users/mans/devel/phenixid/test-ca/src/test/resources/fixtures/tls/ca1/ca.chain.pem
    CApath: none
  • TLSv1.2 (OUT), TLS handshake, Client hello (1):
  • TLSv1.2 (IN), TLS handshake, Server hello (2):
  • TLSv1.2 (IN), TLS handshake, Certificate (11):
  • TLSv1.2 (IN), TLS handshake, Server key exchange (12):
  • TLSv1.2 (IN), TLS handshake, Request CERT (13):
  • TLSv1.2 (IN), TLS handshake, Server finished (14):
  • TLSv1.2 (OUT), TLS handshake, Certificate (11):
  • TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
  • TLSv1.2 (OUT), TLS handshake, CERT verify (15):
  • TLSv1.2 (OUT), TLS change cipher, Client hello (1):
  • TLSv1.2 (OUT), TLS handshake, Finished (20):
  • TLSv1.2 (IN), TLS change cipher, Client hello (1):
  • TLSv1.2 (IN), TLS handshake, Finished (20):
  • SSL connection using TLSv1.2 / ECDHE-RSA-CHACHA20-POLY1305
  • ALPN, server accepted to use http/1.1
  • Server certificate:
  • subject: C=SE; ST=Nacka; L=Nacka Strand; O=Example; OU=Testers; CN=127.0.0.1
  • start date: Dec 14 11:45:08 2018 GMT
  • expire date: Dec 21 11:45:08 2018 GMT
  • subjectAltName: host "127.0.0.1" matched cert‘s IP address!
  • issuer: C=SE; ST=Nacka; O=Example; OU=Testers; CN=Example Intermediate CA 1
  • SSL certificate verify ok.

    GET / HTTP/1.1
    Host: 127.0.0.1
    User-Agent: curl/7.54.0
    Accept: /

    < HTTP/1.1 200 OK
    < Date: Fri, 14 Dec 2018 15:03:31 GMT
    < Server: Apache/2.4.33 (Unix) LibreSSL/2.2.7
    < Content-Location: index.html.en
    < Vary: negotiate
    < TCN: choice
    < Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
    < ETag: "2d-432a5e4a73a80"
    < Accept-Ranges: bytes
    < Content-Length: 45
    < Content-Type: text/html
    <
    <html><body><h1>It works!</h1></body></html>
    与ANSIBLE测试设置

我ansible任务是这样的:

  • name: "GET"
    uri:
    method: GET
    url: https://127.0.0.1/
    validate_certs: yes
    client_cert: "client.SomeUser.cert.pem"
    client_key: "client.SomeUser.privkey.pem"
    这就是我试着运行剧本: ——如果我关掉证书验证在服务器端,客户端接收服务器证书,如果我包括CA链SSL_CERT_FILE env var。好。 ——如果我打开证书验证在服务器端,但把它关掉客户端(validate_certs:没有),服务器接受客户端证书,很好。 ——但如果我打开双方的证书验证,客户无法接受服务器证书。 坏的。

这是ansible命令和输出当失败时:

$ SSL_CERT_FILE=/path/to/ca.chain.pem ansible-playbook my-playbook.yml -vvv
ansible-playbook 2.7.4
config file = /Users/xxx/.ansible.cfg
configured module search path = [‘/Users/xxx/.ansible/plugins/modules‘, ‘/usr/share/ansible/plugins/modules‘]
ansible python module location = /Users/xxx/virtualenvs/p3/lib/python3.7/site-packages/ansible
executable location = /Users/xxx/virtualenvs/p3/bin/ansible-playbook
python version = 3.7.0 (default, Aug 22 2018, 15:22:33) [Clang 9.1.0 (clang-902.0.39.2)]
Using /Users/xxx/.ansible.cfg as config file
/etc/ansible/hosts did not meet host_list requirements, check plugin documentation if this is unexpected
/etc/ansible/hosts did not meet script requirements, check plugin documentation if this is unexpected
Parsed /etc/ansible/hosts inventory source with ini plugin
......output omitted......
The full traceback is:
File "/var/folders/78/n3ytyhrs2415sl3h8h1fms000000gn/T/ansible_uri_payload_bus4199a/ansible_uri_payload.zip/ansible/module_utils/urls.py", line 1259, in fetch_url
client_key=client_key, cookies=cookies)
File "/var/folders/78/n3ytyhrs2415sl3h8h1fms000000gn/T/ansible_uri_payload_bus4199a/ansible_uri_payload.zip/ansible/module_utils/urls.py", line 1162, in open_url
client_cert=client_cert, client_key=client_key, cookies=cookies)
File "/var/folders/78/n3ytyhrs2415sl3h8h1fms000000gn/T/ansible_uri_payload_bus4199a/ansible_uri_payload.zip/ansible/module_utils/urls.py", line 1070, in open
r = urllib_request.urlopen(*urlopen_args)
File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 222, in urlopen
return opener.open(url, data, timeout)
File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 523, in open
req = meth(req)
File "/var/folders/78/n3ytyhrs2415sl3h8h1fms000000gn/T/ansible_uri_payload_bus4199a/ansible_uri_payload.zip/ansible/module_utils/urls.py", line 779, in http_request
build_ssl_validation_error(self.hostname, self.port, paths_checked, e)
File "/var/folders/78/n3ytyhrs2415sl3h8h1fms000000gn/T/ansible_uri_payload_bus4199a/ansible_uri_payload.zip/ansible/module_utils/urls.py", line 580, in build_ssl_validation_error
raise SSLValidationError(‘ ‘.join(msg) % (hostname, port, ", ".join(paths)))

fatal: [127.0.0.1]: FAILED! => {
"changed": false,
"invocation": {
"module_args": {
"attributes": null,
"backup": null,
"body": null,
"body_format": "raw",
"client_cert": "/path/to/client.SomeUser.cert.pem",
"client_key": "/path/to/client.SomeUser.privkey.pem",
"content": null,
"creates": null,
"delimiter": null,
"dest": null,
"directory_mode": null,
"follow": false,
"follow_redirects": "safe",
"force": false,
"force_basic_auth": false,
"group": null,
"headers": {},
"http_agent": "ansible-httpget",
"method": "GET",
"mode": null,
"owner": null,
"regexp": null,
"remote_src": null,
"removes": null,
"return_content": false,
"selevel": null,
"serole": null,
"setype": null,
"seuser": null,
"src": null,
"status_code": [
200
],
"timeout": 30,
"unsafe_writes": null,
"url": "https://127.0.0.1/",
"url_password": null,
"url_username": null,
"use_proxy": true,
"validate_certs": true
}
},
"msg": "Failed to validate the SSL certificate for 127.0.0.1:443. Make sure your managed systems have a valid CA certificate installed. You can use validate_certs=False if you do not need to confirm the servers identity but this is unsafe and not recommended. Paths checked for this platform: /etc/ssl/certs, /etc/ansible, /usr/local/etc/openssl. The exception msg was: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:1045)."
}
如上所述,ansible-playbook调用作品完美的服务器验证客户端证书或客户机验证服务器证书,但不是同时。 因为这是工作与旋度好,我猜一定有毛病uri模块如何处理TLS。

原文地址:http://blog.51cto.com/14021402/2331567

时间: 2024-10-10 01:47:49

Ansible uri模块和双向TLS的相关文章

利用ansible modules模块来自定义集群管理

前沿: 在一些个特定环境下,用ansible做集群管理还是很棒的,这两天看了他的模块,官方提供了很多,就算不够,你也可以自定义定制. 话说我挺喜欢他的modules模块的,够直接 !!! 我这里就说些常见的ansible的modules吧. 下面的ansible service一看大家就懂了,就是服务状态的管理模块 [[email protected] ~ ]$ ansible web -m service -a "name=nginx state=started" 10.150.14

2. ansible常用模块

Ansible通过模块的方式来完成一些远程的管理工作. ansible-doc -l查看所有模块 ansible-doc -s module来查看某个模块的参数, ansible-doc help module来查看该模块更详细的信息. 模块命令 -i 设备列表路径,可以指定一些动态路径 -f 并发任务数 -private-key 私钥路径 -m 模块名称 -M 模块夹的路径 -a 参数 -k 登陆密码 -K sudo密码 -t 输出结果保存路径 -B 后台运行超时时间 -P 调查后台程序时间

ansible常用模块介绍

ansible查看模块用法 例子 查看shell 模块使用方法 [[email protected] opt]# ansible-doc -s shell 注: -i 指定配置文件  tomcatserver自己定义的工作组  -m 指定模块 file模块 file模块包含如下选项: force:需要在两种情况下强制创建软链接,一种是源文件不存在但之后会建立的情况下:另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no group:定义文件/目录的属组 mo

ansible常用模块详解

ansible常用模块详解: ansible <host-pattern> [-m module_name] [-a args] [options] #ansible命令格式  指定主机组或ip地址  指定调用模块   传递给模块的参数   ansible-doc -l #列出可用模块 ansible-doc -s model_name #查看指定模块详细用法 command:ansible默认模块,对指定主机执行命令,不能理解特殊字符 例:ansible web -a 'date' #对we

idou老师教你学Istio 15:Istio实现双向TLS的迁移

在Istio中,双向TLS是传输身份验证的完整堆栈解决方案,它为每个服务提供可跨集群的强大身份.保护服务到服务通信和最终用户到服务通信,以及提供密钥管理系统.本文阐述如何在不中断通信的情况下,把现存Istio服务的流量从明文升级为双向TLS. 使用场景 在部署了Istio的集群中,使用人员刚开始可能更关注功能性,服务之间的通信配置的都是明文传输,当功能逐渐完善,开始关注安全性,部署有sidecar的服务需要使用双向TLS进行安全传输,但服务不能中断,这时,一个可取的方式就是进行双向TLS的迁移.

idou老师教你学Istio 17 : 通过HTTPS进行双向TLS传输

众所周知,HTTPS是用来解决 HTTP 明文协议的缺陷,在 HTTP 的基础上加入 SSL/TLS 协议,依靠 SSL 证书来验证服务器的身份,为客户端和服务器端之间建立"SSL"通道,确保数据运输安全.而Istio的双向TLS也用来保证数据传输安全.那么,Istio的双向TLS是如何与HTTPS服务一起工作的呢? 下面通过实例演示Istio的双向TLS是如何与HTTPS服务一起工作的,包括三个部分: ? 在没有 Istio sidecar 的情况下部署 HTTPS 服务 ? 关闭

Ansible 常用模块详解(3)

title: Ansible 常用模块详解(3) date: 2018-12-01 15:22:11 tags: Ansible categories: Ansible copyright: true --- Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量程序部署.批量运行命令等功能,ansible是基于模块工作的,本身没有批量部署的能力,真正具有批量部署的是an

ansible核心模块playbook介绍

ansible的playbook采用yaml语法,它简单地实现了json格式的事件描述.yaml之于json就像markdown之于html一样,极度简化了json的书写.在学习ansible playbook之前,很有必要把yaml的语法格式.引用方式做个梳理. 1.1 初步说明 以一个简单的playbook为例,说明yaml的基本语法. --- - hosts: 192.168.100.59,192.168.100.65 remote_user: root pre_tasks: - name

ansible基础-模块-playbook-roles角色

1.安装: wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-metadata-parser-1.1.4-10.el7.x86_64.rpm rpm -ivh *.rpm  --nodeps --force 这里我选择强制安装不考虑依赖 (线上注意处理掉依赖问题) yum -y install epel-release yum -y install ansible ansible --version #测试如果显示版本