Mutual SSL authentication

In deze blog laat ik zien wat de stappen zijn om certificaten te maken voor server en client applicaties.

Voor testen kun je de key- en trust stores maken zonder CA. Op productie zal er altijd een CA tussen zitten. Beide manieren worden hieronder besproken.

Een demo project met een server en client die ssl gebruiken (ook als authenticatie) is hier te vinden:

https://github.com/robbertvdzon/clientcertificateexample

Eerste manier (zonder CA)

mutual SSL authentication Diagram (1).png

Genereer de keystore voor de server en de client

Voor de server, gebruik de hostname waaronder de server draait als common name (CN)
Voor de clients, gebruik de naam waarmee je je wilt identificaten als common name (CN)

keytool -genkey -keystore serverkeystore.p12 -alias server -storepass passwd -validity 360 -keysize 2048 -keyalg RSA -dname "CN=localhost, OU=Unknown, O=Unknown, L=Unknown, S=Unknown, C=Unknown"
keytool -genkey -keystore client1keystore.p12 -alias client -storepass passwd -validity 360 -keysize 2048 -keyalg RSA -dname "CN=client1, OU=Unknown, O=Unknown, L=Unknown, S=Unknown, C=Unknown"

Exporteer de certificaten

keytool -exportcert -alias server -keystore serverkeystore.p12 -storepass passwd -keypass passwd -rfc -file server_cert.pem
keytool -exportcert -alias client -keystore client1keystore.p12 -storepass passwd -keypass passwd -rfc -file client1_cert.pem

Importeer het client certificaat in de (nieuwe) truststore voor de server

keytool -import -keystore servertruststore.p12 -file client1_cert.pem -alias client1_microservice -storepass passwd -noprompt

Importeer het server certificaat in de (nieuwe) truststore voor de client

keytool -import -keystore client1truststore.p12 -file server_cert.pem -alias localhost -storepass passwd -noprompt

Tweede manier (met CA)

Kopie van mutual SSL authentication Diagram 2 (1).png

maak CA, server, en clients keystores (met nieuwe keypairs)

keytool -genkey -keystore cakeystore.p12 -alias ca -storepass passwd -validity 360 -keysize 2048 -keyalg RSA -dname "CN=localhost, OU=Unknown, O=Unknown, L=Unknown, S=Unknown, C=Unknown"
keytool -genkey -keystore serverkeystore.p12 -alias server -storepass passwd -validity 360 -keysize 2048 -keyalg RSA -dname "CN=localhost, OU=Unknown, O=Unknown, L=Unknown, S=Unknown, C=Unknown"
keytool -genkey -keystore client1keystore.p12 -alias client -storepass passwd -validity 360 -keysize 2048 -keyalg RSA -dname "CN=client1, OU=Unknown, O=Unknown, L=Unknown, S=Unknown, C=Unknown"

voor de server, gebruik de hostname waaronder de server draait als common name (CN)
Voor de clients, gebruik de naam waarmee je je wilt identificaten als common name (CN)

exporteer het CA certificaat en importeer deze in de truststore voor zowel de server als de clients

keytool -exportcert -alias ca -keystore cakeystore.p12 -storepass passwd -keypass passwd -rfc -file ca_cert.pem
keytool -import -keystore servertruststore.p12 -file ca_cert.pem -alias ca -storepass passwd -noprompt
keytool -import -keystore client1truststore.p12 -file ca_cert.pem -alias ca -storepass passwd -noprompt

genereer nu een CSR van alle drie de keystores

keytool -certreq -keystore serverkeystore.p12 -alias server -keyalg rsa -file server.csr -storepass passwd
keytool -certreq -keystore client1keystore.p12 -alias client -keyalg rsa -file client1.csr -storepass passwd

sign de CSR’s nu door de CA

keytool -gencert -keystore cakeystore.p12 -alias ca -storepass passwd -infile client1.csr -outfile client1_cert.pem -rfc
keytool -gencert -keystore cakeystore.p12 -alias ca -storepass passwd -infile client2.csr -outfile client2_cert.pem -rfc

vervang nu het oude certificaat in de keystores, door de signed versie

keytool -import -keystore client1truststore.p12 -file client1_cert.pem -alias client -storepass passwd -noprompt
keytool -import -keystore client2truststore.p12 -file client2_cert.pem -alias server -storepass passwd -noprompt

 

Resources

https://www.naschenweng.info/2018/02/01/java-mutual-ssl-authentication-2-way-ssl-authentication/

https://www.sslcertificaten.nl/support/Java/Java_Keytool_-_Installatie_certificaat