Search code examples
linuxsslhaproxy

TLS handshake fail. HTTPS request to HAproxy to http and then encrypt it again to forward request to ssl server


Need help!!! . I have an https request and need to intercept it, read values and forward the same ssl request to the destination. I have all the required crt, key, CA with me. I am aware that Haproxy ACL does not work with L4 layer but I'm trying to find a workaround to decrypt the message, read the message, encrypt it again and forward. The reason for reading message is to using ACL i need to read the path difference in carious request and route the request to different servers accordingly. I am trying to intercept the client request to server, the request by default is SSL and server is expecting an SSL request

ssl crt: created a new user with new crt-key pair and used Certificate Signing Requests of server to authenticate it against CA in server

The scenario is that I have an incoming SSL request which I'm capturing into frontend of haproxy with the server certificate, while forwarding that request to a test webserver I am able to see that it has changed from HTTPS to HTTP. Now when I try re-encrypt it, the original destination is not able to accept the request since it is not SSL, I have tried to add the certs in the backend but not useful. Please check my current Haproxy config and please help if possible. I am not an expert in Network communication/ Encryption/ HaProxy.

frontend test
    bind IP:6443 ssl crt <location>
    option httplog
    mode http
    default_backend testback
backend testback
    mode http
    balance roundrobin
    option http-check
    server <host> IP:6443 check fall 3 rise 2 ssl verify required ca-file <loc> crt <loc>

To verify my certicates are valid and connecting: openssl s_client -connect :6443 -cert myuser.crt -key myuser.key -CAfile ca.crt Output:

SSL handshake has read 1619 bytes and written 2239 bytes
Verification: OK

So no problem with Certicates i presume, problem while using Ha proxy for connection

Error: Unable to connect to the server: x509: certificate specifies an incompatible key usage

Ha proxy error: 2021-08-12T14:45:36.930478+02:00 parasilo-27 haproxy[21562]: :34672 [12/Aug/2021:14:45:36.927] server/1: SSL handshake failure 2021-08-12T14:45:37+02:00 localhost haproxy[21562]: :34674 [12/Aug/2021:14:45:37.438] server/1: SSL handshake failure


Solution

  • To sum up what was analyzed in the comments, as asked. Perhaps it will be useful to somebody someday.
    Haproxy's config turned out to be correct, but generated certificates had wrong extended key usage (X509v3 extension). Command to list extended key usage:

    openssl x509 -in /path/to/cert.pem -noout -ext extendedKeyUsage
    

    Often, when bought on internet, it shows X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication. Original Poster used self-signed, self-generated certificates and his certificate used on haproxy's frontend had only TLS Web Client Authentication, where frontend requires TLS Web Server Authentication if this extensions is used at all.
    That resulted in the error message:

    Error: kubectl get po: Unable to connect to the server: x509: certificate specifies an incompatible key usage
    

    As a consequence haproxy logged SSL handshake failure without any more details, as is its habit.

    After adding TLS Web Server Authentication to certificate in haproxy's frontend section and TLS Web Client Authentication to certificate in haproxy's backend section Original Poster reported success.