Hi Dick,

Hmm, very interesting ... Thank you so much for your replication
efforts!

Then it seems indeed a local problem of mine. In my case, Ansible is
executed in a Docker container python:3-slim, which is based on
debian:bookworm-slim. Within the container, 'ansible==10.*' is
installed into a normal user's directory with pip, and Ansible commands
are executed on behalf of that normal user.

I will check if this setup somehow affects the TLS negotiation. I will
update the thread once I find the culprit.

Thank you.

Regards,
Garri


On Sat, 2024-08-17 at 13:09 +0200, Dick Visser wrote:
> Hii
> I tried to replicate what you see. To help debug I spun up an old web
> server that is only doing TLSv1.
> Then, on a clean Debian 12 VM, initially the URL fails to fetch with
> curl, as expected:
> 
> (venv) vagrant@debian-12:~$ curl -Ikv https://tlsv1.tienhuis.nl
> *   Trying [2001:648:2ffc:1225:a800:4ff:fec1:7353]:443...
> * Connected to tlsv1.tienhuis.nl
> (2001:648:2ffc:1225:a800:4ff:fec1:7353) port 443 (#0)
> * ALPN: offers h2,http/1.1
> * TLSv1.3 (OUT), TLS handshake, Client hello (1):
> * TLSv1.3 (IN), TLS handshake, Server hello (2):
> * TLSv1.0 (IN), TLS handshake, Certificate (11):
> * TLSv1.0 (IN), TLS handshake, Server key exchange (12):
> * TLSv1.0 (OUT), TLS alert, internal error (592):
> * OpenSSL/3.0.13: error:0A00014D:SSL routines::legacy sigalg
> disallowed or unsupported
> * Closing connection 0
> curl: (35) OpenSSL/3.0.13: error:0A00014D:SSL routines::legacy sigalg
> disallowed or unsupported
> 
> Likewise, this playbook:
> 
> ---
> - name: legacy test
>   hosts: localhost
>   gather_facts: false
>   connection: local
>   tasks:
>     - name: fetch URL
>       ansible.builtin.uri:
>         url: https://tlsv1.tienhuis.nl
>         validate_certs: false
>       register: out
>     - ansible.builtin.debug: var=out
> 
> also fails at the uri task:
> 
> TASK [fetch URL]
> *********************************************************************
> ************************************************
> fatal: [localhost]: FAILED! => {"changed": false, "elapsed": 0,
> "msg": "Status code was -1 and not [200]: Request failed: <urlopen
> error [SSL] legacy sigalg disallowed or unsupported (_ssl.c:992)>",
> "redirected": false, "status": -1, "url":
> "https://tlsv1.tienhuis.nl"}
> 
> Replacing /etc/ssl/openssl.cnf with the small version that you have 
> 
> (venv) vagrant@debian-12:~$ cat /etc/ssl/openssl.cnf 
> openssl_conf = openssl_init
> [openssl_init]
> ssl_conf = ssl_sect
> [ssl_sect]
> system_default = system_default_sect
> [system_default_sect]
> MinProtocol = TLSv1
> CipherString = DEFAULT@SECLEVEL=0
> Options = UnsafeLegacyRenegotiation
> 
> makes curl work:
> 
> (venv) vagrant@debian-12:~$ curl -Ikv https://tlsv1.tienhuis.nl
> *   Trying [2001:648:2ffc:1225:a800:4ff:fec1:7353]:443...
> * Connected to tlsv1.tienhuis.nl
> (2001:648:2ffc:1225:a800:4ff:fec1:7353) port 443 (#0)
> * ALPN: offers h2,http/1.1
> * TLSv1.3 (OUT), TLS handshake, Client hello (1):
> * TLSv1.3 (IN), TLS handshake, Server hello (2):
> * TLSv1.0 (IN), TLS handshake, Certificate (11):
> * TLSv1.0 (IN), TLS handshake, Server key exchange (12):
> * TLSv1.0 (IN), TLS handshake, Server finished (14):
> * TLSv1.0 (OUT), TLS handshake, Client key exchange (16):
> * TLSv1.0 (OUT), TLS change cipher, Change cipher spec (1):
> * TLSv1.0 (OUT), TLS handshake, Finished (20):
> * TLSv1.0 (IN), TLS handshake, Finished (20):
> * SSL connection using TLSv1 / ECDHE-RSA-AES256-SHA
> * ALPN: server did not agree on a protocol. Uses default.
> * Server certificate:
> *  subject: CN=tlsv1.tienhuis.nl
> *  start date: Aug 17 10:25:11 2024 GMT
> *  expire date: Jan 17 10:25:11 2038 GMT
> *  issuer: CN=tlsv1.tienhuis.nl
> *  SSL certificate verify result: self-signed certificate (18),
> continuing anyway.
> * using HTTP/1.x
> > HEAD / HTTP/1.1
> > Host: tlsv1.tienhuis.nl
> > User-Agent: curl/7.88.1
> > Accept: */*
> > 
> < HTTP/1.1 200 OK
> 
> BUT, it also makes the uri task in the ansible playbook work:
> 
> TASK [ansible.builtin.debug]
> *********************************************************************
> ************************************
> ok: [localhost] => {
>     "out": {
>         "accept_ranges": "bytes",
>         "changed": false,
>         "connection": "close",
>         "content_length": "10701",
>         "content_type": "text/html",
>         "cookies": {},
>         "cookies_string": "",
>         "date": "Sat, 17 Aug 2024 11:02:40 GMT",
>         "elapsed": 0,
>         "etag": "\"29cd-61fde5e24e55f\"",
>         "failed": false,
>         "last_modified": "Sat, 17 Aug 2024 10:16:22 GMT",
>         "msg": "OK (10701 bytes)",
>         "redirected": false,
>         "server": "Apache/2.4.10 (Debian)",
>         "status": 200,
>         "url": "https://tlsv1.tienhuis.nl";,
>         "vary": "Accept-Encoding"
>     }
> }
> 
> This seems to indicate a local problem somewhere on your side....
> FYI, on my control node:
> 
> (venv) vagrant@debian-12:~$ ansible --version
> ansible [core 2.17.3]
>   config file = None
>   configured module search path =
> ['/home/vagrant/.ansible/plugins/modules',
> '/usr/share/ansible/plugins/modules']
>   ansible python module location =
> /home/vagrant/venv/lib/python3.11/site-packages/ansible
>   ansible collection location =
> /home/vagrant/.ansible/collections:/usr/share/ansible/collections
>   executable location = /home/vagrant/venv/bin/ansible
>   python version = 3.11.2 (main, May  2 2024, 11:59:08) [GCC 12.2.0]
> (/home/vagrant/venv/bin/python3)
>   jinja version = 3.1.4
>   libyaml = True
> (venv) vagrant@debian-12:~$ pip list
> Package      Version
> ------------ -------
> ansible-core 2.17.3
> cffi         1.17.0
> cryptography 43.0.0
> Jinja2       3.1.4
> MarkupSafe   2.1.5
> packaging    24.1
> pip          24.2
> pycparser    2.22
> PyYAML       6.0.2
> resolvelib   1.0.1
> setuptools   66.1.1
> wheel        0.44.0
> (venv) vagrant@debian-12:~$ openssl version
> OpenSSL 3.0.13 30 Jan 2024 (Library: OpenSSL 3.0.13 30 Jan 2024)
> (venv) vagrant@debian-12:~$ uname -a
> Linux debian-12 6.1.0-23-arm64 #1 SMP Debian 6.1.99-1 (2024-07-15)
> aarch64 GNU/Linux
> 
> 
> On Sat, 17 Aug 2024 at 00:33, Garri Djavadyan <[email protected]>
> wrote:
> > Hi Dick, Walter, and all,
> > 
> > Dick, I totally agree that patching Ansible to support insecure
> > protocols should be discouraged in general, and I am totally fine
> > to
> > continue using my current curl-based playbook until the legacy
> > devices
> > are decommissioned. I was just curious if it would be possible to
> > use
> > 'ansible.builtin.uri' in an unsafe OpenSSL context without touching
> > the
> > Ansible code. 
> > 
> > Walter, as far as I know, Linux kernel's TLS sockets (ktls) [1]
> > only
> > provide encryption offloading capabilities to the user space
> > libraries,
> > such as OpenSSL. As far as I can see, the handshake still should be
> > handled by the user space library.
> > 
> > As far as I know, 'ansible.builtin.uri' depends on the Python
> > standard
> > library's 'urllib' [2], which depends on the 'ssl' module [3], also
> > from the standard library. The latter, depends on the user space
> > OpenSSL library.
> > 
> > Also, as I mentioned before, I can successfully talk to my legacy
> > devices using "curl" and loosened OpenSSL configuration, that I
> > shared
> > earlier, from the same Debian 12.6 system. Therefore, I do not
> > think
> > the kernel prohibits 'uri' from negotiating TLS 1.0 connections.
> > 
> > Thank you.
> > 
> > Regards,
> > Garri
> > 
> > 
> > [1] https://www.kernel.org/doc/html/latest/networking/tls.html
> > [2]
> > https://github.com/ansible/ansible/blob/v2.17.3/lib/ansible/module_utils/urls.py#L54
> > [3] https://docs.python.org/3/library/ssl.html
> > 
> > 
> > On Fri, 2024-08-16 at 11:13 +0000, 'Rowe, Walter P. (Fed)' via
> > Ansible
> > Project wrote:
> > > If the kernel / OS won't allow lowering the TLS then a custom
> > > openssl.conf likely won't either. You can't override the kernel /
> > > OS
> > > to lower security.
> > > 
> > > Walter
> > > --
> > > Walter Rowe, Division Chief
> > > Infrastructure Services Division
> > > Mobile: 202.355.4123 
> > > 
> > > > On Aug 16, 2024, at 5:23 AM, Dick Visser <[email protected]>
> > > > wrote:
> > > > 
> > > > 
> > > > 
> > > > 
> > > > 
> > > > Hii
> > > > 
> > > > Hacking ansible to make it work with its native uri module may
> > > > work, but it will likely make the hack go under the radar.
> > > > 
> > > > 
> > > > Since it is already a security lowering snowflake, IMHO it is
> > > > good
> > > > to make this explicit by having it done in a custom
> > > > shell/command.
> > > > It is simple, easy, and makes it very clear what is going on
> > > > for
> > > > this specific device.
> > > > 
> > > > 
> > > > 
> > > > 
> > > > On Thu, 15 Aug 2024 at 23:31, Garri Djavadyan
> > > > <[email protected]> wrote:
> > > > > Hi Walter,
> > > > > 
> > > > > > Your system may not allow older TLS connections.
> > > > > 
> > > > > Exactly, and this is why I currently have to use a custom
> > > > > weakened openssl.cnf by the curl-based Ansible playbook.
> > > > > However,
> > > > > the environment variable OPENSSL_CONF, referring to the
> > > > > custom
> > > > > OpenSSL config, is ignored when I use "ansible.builtin.uri".
> > > > > Actually, "ansible.builtin.uri" even ignores by OpenSSL
> > > > > config
> > > > > located in the default path /etc/ssl/openssl.cnf on my Debian
> > > > > 12.6 system:
> > > > > 
> > > > > -----BEGIN SHELL-----
> > > > > $ cat /etc/ssl/openssl.cnf
> > > > > openssl_conf = openssl_init
> > > > > 
> > > > > [openssl_init]
> > > > > ssl_conf = ssl_sect
> > > > > 
> > > > > [ssl_sect]
> > > > > system_default = system_default_sect
> > > > > 
> > > > > [system_default_sect]
> > > > > MinProtocol = TLSv1
> > > > > CipherString = DEFAULT@SECLEVEL=0
> > > > > Options = UnsafeLegacyRenegotiation
> > > > > 
> > > > > 
> > > > > $ ansible-playbook -vvv test.yml
> > > > > ...
> > > > > "msg": "Status code was -1 and not [200]: Request failed:
> > > > > <urlopen error [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3
> > > > > alert
> > > > > handshake failure (_ssl.c:1000)>",
> > > > > ...
> > > > > -----END SHELL-----
> > > > > 
> > > > > 
> > > > > Thank you.
> > > > > 
> > > > > Regards,
> > > > > Garri
> > > > > 
> > > > > 
> > > > > 
> > > > > On Thursday, August 15, 2024 at 1:15:22 PM UTC+2 Rowe, Walter
> > > > > P.
> > > > > (Fed) wrote:
> > > > > > Check your system settings. Your system may not allow older
> > > > > > TLS
> > > > > > connections. TLS 1.0 is compromised and therefore no longer
> > > > > > allowed by many systems.
> > > > > > 
> > > > > > What platform is your control host?
> > > > > > 
> > > > > > Walter
> > > > > > --
> > > > > > Walter Rowe, Division Chief
> > > > > > Infrastructure Services Division
> > > > > > Mobile: 202.355.4123 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > > On Aug 15, 2024, at 5:00 AM, Garri Djavadyan
> > > > > > > <[email protected]> wrote:
> > > > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > > Hi Steve,
> > > > > > > 
> > > > > > > > Did you try with SECLEVEL=0 ?
> > > > > > > 
> > > > > > > Yes, I did. However, the result is the same: Ansible
> > > > > > > controller is not happy with the bare TLS 1.0 reply from
> > > > > > > the
> > > > > > > legacy box:
> > > > > > > 
> > > > > > > "msg": "Status code was -1 and not [200]: Request failed:
> > > > > > > <urlopen error [SSL: UNSUPPORTED_PROTOCOL] unsupported
> > > > > > > protocol (_ssl.c:1000)>"
> > > > > > > 
> > > > > > > 
> > > > > > > - name: Query legacy boxes
> > > > > > >   hosts: legacyboxes
> > > > > > >   gather_facts: false
> > > > > > >   connection: local
> > > > > > >   tasks:
> > > > > > >     - name: GET the home page
> > > > > > >       ansible.builtin.uri:
> > > > > > >         url: https://{{ ansible_host }}
> > > > > > >         ciphers:
> > > > > > >           - 'DEFAULT@SECLEVEL=0'
> > > > > > >           
> > > > > > > 
> > > > > > > Again, ciphers-wise, the setup is fine, but I do not
> > > > > > > think it
> > > > > > > is possible to enforce the minimum TLS protocol version
> > > > > > > with
> > > > > > > the cipher string.
> > > > > > > 
> > > > > > > Thank you.
> > > > > > > 
> > > > > > > Regards,
> > > > > > > Garri
> > > > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > > -- 
> > > > > > > You received this message because you are subscribed to
> > > > > > > the
> > > > > > > Google Groups "Ansible Project" group.
> > > > > > > To unsubscribe from this group and stop receiving emails
> > > > > > > from
> > > > > > > it, send an email [email protected].
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > > To view this discussion on the web visit
> > > > > > > https://groups.google.com/d/msgid/ansible-project/85e58522-271e-45aa-832a-8a2a7c6b5a38n%40googlegroups.com
> > > > > > > .
> > > > > > 
> > > > > > 
> > > > > 
> > > > > -- 
> > > > > You received this message because you are subscribed to the
> > > > > Google Groups "Ansible Project" group.
> > > > > To unsubscribe from this group and stop receiving emails from
> > > > > it,
> > > > > send an email [email protected].
> > > > > To view this discussion on the web visit
> > > > > https://groups.google.com/d/msgid/ansible-project/fe2f9e80-a54e-4ffc-87f1-bdfe8788c858n%40googlegroups.com
> > > > > .
> > > > > 
> > > > 
> > 

-- 
You received this message because you are subscribed to the Google Groups 
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/7eda6be1bdba7cb54ebcd0e868b0ecac5a8819bc.camel%40gmail.com.

Reply via email to