Quantcast
Channel: Configuration - Home Assistant Community
Viewing all articles
Browse latest Browse all 95919

SSL client certificate with reverse proxy - 400 Bad Request - No required SSL certificate was sent

$
0
0

@inspire wrote:

Hi!

I’m trying to establish a client certificate/mutual authentication mechanism with this setup:

Computer (shall require certificate) <-> xxx.duckdns.org <-> reverse-proxy (nginx) <-> server application

The reverse proxy works fine if I do not use a client certificate. But once I set it up and configure it in nginx I can’t solve this error:

400 Bad Request

No required SSL certificate was sent

The nginx error log also shows

client sent no required SSL certificate while reading client request headers, client: …, server: xxx.duckdns.org, request: “GET /service_worker.js HTTP/2.0”, host: “xxx.duckdns.org

The certificate was generated according to this page:

echo "Setting up client-certificate signing CA ..."
openssl genrsa -aes256 -passout pass:${PRIVATE_CA_PASSWORD} -out ca.pass.key 4096
openssl rsa -passin pass:${PRIVATE_CA_PASSWORD} -in ca.pass.key -out ca.key

echo "Make the signing CA valid for 100 years ..."
openssl req -new -x509 -days 36500 -key ca.key -out ca.pem -subj '/CN=Martin'

echo "Creating a client keypair ..."
echo "- RSA key"
openssl genrsa -aes256 -passout pass:${PUBLIC_KEY} -out ${CLIENT_ID}.pass.key 4096
openssl rsa -passin pass:${PUBLIC_KEY} -in ${CLIENT_ID}.pass.key -out ${CLIENT_ID}.key
echo "- CSR"
openssl req -new -passin pass:${PUBLIC_KEY} -key ${CLIENT_ID}.key -out ${CLIENT_ID}.csr -subj '/CN=User'

echo "Signing this key with the CA ..."
# valid: 100 years
openssl x509 -req -days 36500 -in ${CLIENT_ID}.csr -CA ca.pem -CAkey ca.key -set_serial ${CLIENT_SERIAL} -passin pass:${PRIVATE_CA_PASSWORD} -out ${CLIENT_ID}.pem

echo "Generating crt file from pem file ..."
openssl x509 -outform der -in ${CLIENT_ID}.pem -out ${CLIENT_ID}.crt

echo "Bundle client key into pfx file ..."
openssl pkcs12 -export -out ${CLIENT_ID}.pfx -inkey ${CLIENT_ID}.key -in ${CLIENT_ID}.pem -certfile ca.pem -password pass:${EXPORT_PASSWORD}

echo "Checking certificate ..."
openssl verify -CAfile ca.pem user.pem

The certificate check in the last line shows OK in the end.

On the computer I tried out using the ${CLIENT_ID}.pfx and the ${CLIENT_ID}.crt - both without success.

Before trying this, I established the SSL certificate for the proxy according to this page using certbot-auto.

The nginx config looks like this:

map $http_upgrade $connection_upgrade {
	default upgrade;
	''      close;
}

server {
	server_name xxx.duckdns.org;

	listen [::]:80 default_server ipv6only=off;
	return 301 https://$host$request_uri;
}

server {
	server_name xxx.duckdns.org;

	ssl_certificate /etc/letsencrypt/live/xxx.duckdns.org/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/xxx.duckdns.org/privkey.pem;

	ssl_trusted_certificate /etc/letsencrypt/live/xxx.duckdns.org/chain.pem;

	ssl_dhparam /etc/nginx/ssl/dhparams.pem;

	listen [::]:443 ssl http2 default_server ipv6only=off;
	add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
	
	ssl on;
	ssl_protocols TLSv1.2 TLSv1.3;
	ssl_ciphers TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-AES-128-GCM-SHA256:EECDH+CHACHA20:EECDH+AESGCM:EECDH+AES;
	ssl_prefer_server_ciphers on;
	ssl_session_cache shared:SSL:10m;
	ssl_session_timeout 1d;

	### once I remove these 3 lines everything works but without the client certificate ###
	ssl_client_certificate /etc/nginx/certificates/ca.pem;
	ssl_verify_client on;
	ssl_verify_depth 3;

	# OCSP stapling
	ssl_stapling on;
	ssl_stapling_verify on;

	proxy_buffering off;

	location / {
		# the server application runs on port 30303 of the same machine
		proxy_pass https://127.0.0.1:30303;
		proxy_set_header Host $host;
		proxy_redirect http:// https://;
		proxy_http_version 1.1;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection $connection_upgrade;
	}
}

The nginx error sounds like the client did not even try to send a certificate… the certificate chain does not seem to be established? (no wonder - I did not use any of the files from the SSL proxy certificate generation in the client certificate generation or vise versa.)

How can I invoke this in the given setup? Basically all tutorials I read only state that in nginx I need to use the ssl_client_certificate option… but I could not find information about the usage together with a DNS server and a reverse proxy.

Thanks a lot for hints! :slight_smile:

Posts: 8

Participants: 2

Read full topic


Viewing all articles
Browse latest Browse all 95919

Trending Articles