Self signed SSL certificaten

Ik draai al jaren een website met een self signed SSL certificaat. Op zich werkt dit perfect behalve dat Chrome op mijn Android telefoon van tijd tot tijd me weer een waarschuwing geeft. Open je de site vanaf je Homescreen als standalone web app dan blijf je ook altijd een balk zien met een rood kruis (ongeldig certificaat). Ik heb al eens eerder geprobeerd om het SSL certificaat toe te voegen aan Android zodat deze vertrouwd zou zijn echter lukte dit steeds niet.

Vandaag kwam ik er achter dat je aan Android alleen root CA certificaten kan toevoegen. Tegelijkertijd kwam ik er meer achter hoe SSL certificaten werken en wat nu een root Certificate Authority (CA) is. Voor de uitleg over root CA verwijs ik naar dit filmpje.

Zodra je dus een root certificaat toevoegd aan je browser worden automatische alle certificaten die ondertekend zijn met dit root certificaat zonder problemen geaccepteerd. Ideaal dus voor een testomgeving of wanneer je zelf meerdere domeinen host met een self signed certificaat.

Een root certificaat aanmaken

Als eerste genereren we een private key

$ openssl genrsa 8192 > rootca.key

Genereer daarna het certificaat. Pas het aantal dagen dat deze geldig is naar wens aan. Ik heb deze op 10 jaar staan.

$ openssl req -x509 -new -nodes -key rootca.key -days 3652 > rootca.pem

Tijdens het aanmaken van het certificaat worden je enkele gegevens gevraagd en daarna is het certificaat gegenereerd. Dit certificaat kun je nu zonder problemen toevoegen aan bijvoorbeeld Chrome en Firefox. Voor Android moeten we nog een extra stap doen.

Format aanpassen voor Android

Voer de onderstaande code uit om het format van het certificaat aan te passen naar DER.

$ openssl x509 -in rootca.pem -outform der -out rootca.der.crt

Dit aangepaste certificaat kun je het makkelijkst naar Android krijgen door deze op via een url beschikbaar te maken. Wanneer je dan naar de betreffende URL gaat op je telefoon zal automatisch gevraagd worden om het certificaat te installeren. Geef een naam op en druk op opslaan. Je kan dit certificaat terug vinden onder Settings -> Security -> Trusted Credentials -> User.

Android certificate install

Een certificaat maken

Opnieuw moeten we een private key genereren

openssl genrsa 4096 > mijndomein.nl.key

Hierna maken we een Certificate Signing Request (CSR)

openssl req -new -key mijndomein.nl.key > mijndomein.nl.csr

Vervolgens worden je wederom allerlei gegevens gevraagd. Het challenge password en de optional company name kun je gewoon leeg laten.

Wanneer je een certificaat wil maken voor een los domein kun je nu je certificaat genereren met het volgende commando. Wil je extra’s zoals een multi domain certificaat scroll sla deze stap dan over en ga naar extensions.

openssl x509 -req -days 3652 -CA rootca.pem -CAkey rootca.key -CAcreateserial -in mijndomein.nl.csr > mijndomein.nl.pem

Als laatste kun je nog een info bestand maken waarmee je de gegevens van het certificaat kan zien. Deze stap is echter optioneel.

openssl x509 -in mijndomein.nl.pem -text > mijndomein.nl.info

Extensions

Aangezien ik een multi domain certificaat wil hebben moeten we nog het e.a. toevoegen. Maak een bestand aan genaamd v3.ext en voeg daar de volgende opties aan toe. Pas de DNS regels aan naar je eigen wensen.

[mijndomein_ext]
basicConstraints         = critical,CA:false
keyUsage                 = critical,keyEncipherment,dataEncipherment
subjectKeyIdentifier     = hash
authorityKeyIdentifier   = keyid,issuer
subjectAltName           = @mijndomein_ext_subject

[mijndomein_ext_subject]
DNS.1 = mijndomein.nl
DNS.2 = *.mijndomein.nl

Nu kunnen we ons certificaat aan gaan maken.

openssl x509 -req -days 3652 -CA rootca.pem -CAkey rootca.key -CAcreateserial -in mijndomein.nl.csr -extfile v3.ext -extensions mijndomein_ext > mijndomein.nl.pem

Het certificaat is nu aangemaakt, deze kun je nu gebruiken is allerlei applicaties.

Beveiliging

Private keys mogen eigenlijk alleen door root gelezen worden. Dit omdat anders iedereen met toegang tot de keys deze kan lezen en dus ook nieuwe certificaten aanmaken. Voor daarom altijd een chown en een chmod uit.

chown root:root *.key
chmod 600 *.key

Certificaat gebruiken in Apache2

Om SSL te activeren binnen apache moet je het volgende toevoegen aan je virtualhost:

SSLEngine On
SSLCertificateFile /etc/apache2/ssl/mijndomein.nl.pem
SSLCertificateKeyFile /etc/apache2/ssl/mijndomein.nl.key

Gebruikte bronnen: