0

I'm setting up haproxy to act as intermediary between the internet and a number of services running in an otherwise-isolated k8s cluster.

I've already successfully tested the connection to backend via plain http, but now I'm trying to handle the SSL component on there as well and for some reason no matter what I try I'm getting the following in the logs:

Jan 22 11:10:22 jake haproxy[170526]: 95.214.55.185:34832 [22/Jan/2025:11:10:21.968] xanadu-ingress-front/3: SSL handshake failure (error:0A000076:SSL routines::no suitable signature algorithm) 

Trying to troubleshoot via openssl s_client gives me the following (IP addresses and DNS names changed to protect the guilty):

shadur@luminosity:~$ openssl s_client --connect teapot.example.com:443 Connecting to 1.2.3.4 CONNECTED(00000003) 40E7B2BBBA7F0000:error:0A000410:SSL routines:ssl3_read_bytes:ssl/tls alert handshake failure:../ssl/record/rec_layer_s3.c:907:SSL alert number 40 --- no peer certificate available --- No client certificate CA names sent --- SSL handshake has read 7 bytes and written 335 bytes Verification: OK --- New, (NONE), Cipher is (NONE) This TLS version forbids renegotiation. Compression: NONE Expansion: NONE No ALPN negotiated Early data was not sent Verify return code: 0 (ok) 

haproxy config file below:

global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin stats timeout 30s user haproxy group haproxy daemon # Default SSL material locations ca-base /etc/ssl/certs crt-base /etc/ssl/private # generated 2025-01-22, Mozilla Guideline v5.7, HAProxy 3.1.2, OpenSSL 3.4.0, intermediate config # https://ssl-config.mozilla.org/#server=haproxy&version=3.1.2&config=intermediate&openssl=3.4.0&guideline=5.7 # intermediate configuration ssl-default-bind-curves X25519:prime256v1:secp384r1 ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305 ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256 ssl-default-bind-options prefer-client-ciphers ssl-min-ver TLSv1.2 no-tls-tickets ssl-default-server-curves X25519:prime256v1:secp384r1 ssl-default-server-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305 ssl-default-server-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256 ssl-default-server-options ssl-min-ver TLSv1.2 no-tls-tickets # curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam ssl-dh-param-file /etc/ssl/private/dhparam defaults log global mode http option httplog option dontlognull timeout connect 5000 timeout client 50000 timeout server 50000 errorfile 400 /etc/haproxy/errors/400.http errorfile 403 /etc/haproxy/errors/403.http errorfile 408 /etc/haproxy/errors/408.http errorfile 500 /etc/haproxy/errors/500.http errorfile 502 /etc/haproxy/errors/502.http errorfile 503 /etc/haproxy/errors/503.http errorfile 504 /etc/haproxy/errors/504.http crt-store company crt-base /etc/ssl/certs/ key-base /etc/ssl/private/ load crt "company.com-full.pem" key "company.nl.key" alias "company" load crt "company.net-full.pem" key "company.net.key" alias "company.net" frontend xanadu-ingress-front bind 1.2.3.4:80 bind 1:2:3:4:5:6:7:8:80 transparent bind 1.2.3.4:443 ssl crt-list /etc/ssl/crt-lists/company.list alpn h2,http/1.1 http-request redirect scheme https unless { ssl_fc } default_backend xanadu-ingress-back option httplog backend xanadu-ingress-back mode http server xanadu 172.16.41.80:80 check 

I'm fairly sure I'm missing something very simple and obvious but I can't figure out what. Any help would be appreciated.

2
  • "signatures using SHA1 and MD5 are also forbidden at this level as they have less than 80 security bits. Additionally, SSLv3, TLS 1.0, TLS 1.1 and DTLS 1.0 are all disabled at this level." docs.openssl.org/3.3/man3/SSL_CTX_set_security_level/… Commented Jan 22 at 11:28
  • @GregAskew The SSL settings I obtained directly from the mozilla config sit as per the URL in its comment. I'm also not sure why the comment is relevant given that neither SHA1 nor MD5 are mentioned in the config at all. Commented Jan 22 at 11:59

1 Answer 1

0

I was missing something important, it just wasn't where I was expecting.

It turns out haproxy is very picky about the order of certificates in a 'full' PEM; the correct order is sever cert followed by CA cert, and doesn't actually say there's a problem if you got the order wrong, it just doesn't offer a handshake when something connects with SSL.

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.