Bei der Mutual SSL Authentication authentifizieren sich der Server und der Client gegenseitig.
PoC Setup

In diesem PoC authentifizieren sich der Load Balancer und der Server 1, bzw. Load Balancer und der Server 2, gegenseitig.
Der User kann durch den Load Balancer die Seite des Server 1, bzw. Server 2, aufrufen.
Ein direkter Aufruf der Seite auf den Servern, also ohne Load Balancer, ist nicht möglich, da nur der Load Balancer sich an den Servern 1&2 authentifizieren kann.
Zu Testzwecken wird allerdings Server 2 offen gehalten, eine Authentifizierung ist nicht erforderlich.
Keys und Zertifikate
Es wird eine eigene CA zum signieren der Zertifikate benötigt.
Für jeden Server wird ein Private Key und signierter Public Key benötigt.
Der LoadBalancer benötigt noch einen kombinierten Key aus seinem Private und Public Key.
Alle Dateien werden im Ordner certs abgelegt.
## Create CA # Generate CA Key: openssl genrsa -out ca-key.pem 2048 # Generate CA Certificate: openssl req -x509 -new -nodes -extensions v3_ca -key ca-key.pem -days 1024 -out ca-root.pem -sha512 -subj "/C=DE/ST=NRW/L=Leverkusen/O=DerIngo/OU=IT Department/CN=deringo.de" ## Generate LoadBalancer # Generate LoadBalancer Key: openssl genrsa -out loadbalancer-key.pem 2048 ## Generate CSR LoadBalancer vim loadbalancer_csr_details.txt openssl req -new -key loadbalancer-key.pem -out loadbalancer.csr -config loadbalancer_csr_details.txt ## Sign CSR vim loadbalancer_ssl-extensions-x509.conf openssl x509 -req -in loadbalancer.csr -CA ca-root.pem -CAkey ca-key.pem -CAcreateserial -out loadbalancer.crt -days 365 -sha512 -extensions v3_ca -extfile loadbalancer_ssl-extensions-x509.conf ## Mutual SSL - Reverse Proxy ## Create a file with the private and the signed public key: # copy private key cp loadbalancer-key.pem loadbalancer-combined.key # copy public key (without public key of CA) cat loadbalancer.crt >> loadbalancer-combined.key ## Add Public Key of CA to Public Key of RP cat ca-root.pem >> loadbalancer.crt ## Generate Server_1 # Generate Server_1 Key: openssl genrsa -out server_1-key.pem 2048 ## Generate CSR Server_1 vim server_1_csr_details.txt openssl req -new -key server_1-key.pem -out server_1.csr -config server_1_csr_details.txt ## Sign CSR vim server_1_ssl-extensions-x509.conf openssl x509 -req -in server_1.csr -CA ca-root.pem -CAkey ca-key.pem -CAcreateserial -out server_1.crt -days 365 -sha512 -extensions v3_ca -extfile server_1_ssl-extensions-x509.conf ## Add Public Key of CA to Public Key of RP cat ca-root.pem >> server_1.crt ## Generate Server_2 # Generate Server_2 Key: openssl genrsa -out server_2-key.pem 2048 ## Generate CSR Server_2 vim server_2_csr_details.txt openssl req -new -key server_2-key.pem -out server_2.csr -config server_2_csr_details.txt ## Sign CSR vim server_2_ssl-extensions-x509.conf openssl x509 -req -in server_2.csr -CA ca-root.pem -CAkey ca-key.pem -CAcreateserial -out server_2.crt -days 365 -sha512 -extensions v3_ca -extfile server_2_ssl-extensions-x509.conf ## Add Public Key of CA to Public Key of RP cat ca-root.pem >> server_2.crt
Mutual SSL
LoadBalancer
Create a file with the private and the signed public key (bereits im Schritt zuvor erfolgt):
## Mutual SSL - Reverse Proxy ## Create a file with the private and the signed public key: # copy private key cp loadbalancer-key.pem loadbalancer-combined.key # copy public key (without public key of CA) cat loadbalancer.crt >> loadbalancer-combined.key
To communicate to the application server with SSL we need this lines in our HTTP configuration:
SSLProxyEngine On SSLProxyMachineCertificateFile /usr/local/apache2/conf/combined.key
Server_1
Die Verifizierung des Clients wird aktiviert.
SSLVerifyClient require SSLCACertificateFile /usr/local/apache2/conf/server.crt
Server_2
Die Verifizierung des Clients wird nicht aktiviert.
Docker
Es wird Load Balancer, Server 1 und Server 2 definiert.
Für beide Server wird ein Port nach Außen zum Testen aufgemacht.
version: '3.8' services: loadbalancer: build: ./loadbalancer hostname: loadbalancer volumes: - ${PWD}/loadbalancer/conf/loadbalancer_httpd.conf:/usr/local/apache2/conf/httpd.conf - ${PWD}/loadbalancer/conf/loadbalancer.conf:/usr/local/apache2/conf/loadbalancer.conf - ${PWD}/loadbalancer/conf/loadbalancer-ssl.conf:/usr/local/apache2/conf/loadbalancer-ssl.conf - ${PWD}/certs/loadbalancer.crt:/usr/local/apache2/conf/server.crt - ${PWD}/certs/loadbalancer-key.pem:/usr/local/apache2/conf/server.key - ${PWD}/certs/loadbalancer-combined.key:/usr/local/apache2/conf/combined.key ports: - 80:80 - 443:443 server_1: build: ./server_1 hostname: server_1 volumes: - ./server_1/public_html:/usr/local/apache2/htdocs - ${PWD}/server_1/conf/server_httpd.conf:/usr/local/apache2/conf/httpd.conf - ${PWD}/server_1/conf/server.conf:/usr/local/apache2/conf/server.conf - ${PWD}/server_1/conf/server-ssl.conf:/usr/local/apache2/conf/server-ssl.conf - ${PWD}/certs/server_1.crt:/usr/local/apache2/conf/server.crt - ${PWD}/certs/server_1-key.pem:/usr/local/apache2/conf/server.key ports: - 8091:443 server_2: build: ./server_2 hostname: server_2 volumes: - ./server_2/public_html:/usr/local/apache2/htdocs - ${PWD}/server_2/conf/server_httpd.conf:/usr/local/apache2/conf/httpd.conf - ${PWD}/server_2/conf/server.conf:/usr/local/apache2/conf/server.conf - ${PWD}/server_2/conf/server-ssl.conf:/usr/local/apache2/conf/server-ssl.conf - ${PWD}/certs/server_2.crt:/usr/local/apache2/conf/server.crt - ${PWD}/certs/server_2-key.pem:/usr/local/apache2/conf/server.key ports: - 8092:443
Test
https://localhost
Man landet abwechselnd auf beiden Servern:


https://localhost:8091/
Ein direkter Zugriff auf Server_1 wird nicht gestattet, da der Client (unser Browser) nicht verifiziert werden konnte.

https://localhost:8092/
Ein direkter Zugriff auf Server_2 ist möglich, da wir auf diesem Server keine Verifizierung aktiviert haben.

GitHub
Die Dateien zu diesem Post sind im OneLogin-GitHub-Projekt unter version8 zu finden.