Dit artikel geeft een korte instructie om je eigen Certificate Authority te maken waarmee je zelf SSL certificaten maakt om lokaal te kunnen ontwikkelen.

Wat gaan we opzetten?

  • Lokale Root Certificate Authority
  • Een SSL certificaat met een SAN extensie zodat meerdere domeinnamen via 1 certificaat kunnen lopen
  • Basis Apache2 configuratie om het SSL certificaat in gebruik te namen
  • Redirect non-ssl to ssl versie

Root Certificate Authority opzetten

Het Root CA is nodig om de lokaal uitgegeven certificaat te ondertekenen. Nadat het RootCA is gemaakt kan je deze zelf op elk apparaat installeren, zodat je eigen uitgegeven certificaten vertrouwd worden. Deze stap is maar 1 keer nodig.

Maak eerst een directory aan waar je alles in op wilt slaan, bijvoorbeeld in /etc/apache2/ssl en ga naar deze directory.

Private key maken

Maak eerst een private key aan met een wachtwoord. Het is belangrijk dat je dit wachtwoord goed bewaard, deze ben je iedere keer nodig als je een nieuw certificaat wilt uitgeven.

openssl genrsa -out rootCA.key 4096

Certificaat maken voor de RootCA

Geef nu de opdracht om op basis van de private key het certificaat voor de RootCA te maken. Nadat je deze opdracht hebt gegeven worden er een aantal vragen gesteld.

openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.crt

Beantwoord nu de volgende vragen (natuurlijk wel met je eigen informatie)

Country Name (2 letter code) []:NL
State or Province Name (full name) []:Overijssel
Locality Name (eg, city) []:Vroomshoop
Organization Name (eg, company) []:Elitelabs
Organizational Unit Name (eg, section) []:Elitelabs Root CA
Common Name (eg, fully qualified host name) []:
Email Address []:ca@elitelabs.nl

Je eigen RootCA is nu gemaakt en klaar voor gebruik.

Lokaal certificaat maken

In dit voorbeeld maak ik 1 certificaat aan die voor meerdere domeinnamen gebruikt kan worden.

Configuratie voor SAN extensie maken

SAN staat voor Subject Alternative Name en is een extensie die we kunnen gebruiken in een enkel certificaat. Simpel gezegd geeft het een lijst weer van domeinnamen die bij dit certificaat horen.

Lokale certificaten kunnen worden gebruikt om een VirtualHost in Apache zonder fouten of waarschuwingen te kunnen benaderen.

Maak het bestand localdev.ext aan en vul deze als volgt:

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = localdomain1.int
DNS.2 = localdomain2.int

Private key voor lokaal certificaat maken

openssl genrsa -out localdev.key 2048

CSR maken

CSR staat voor het Certificate Signing Request. Dit CSR bevat alle informatie omtrend het certificaat. Deze maken we aan op basis van de private key.

openssl req -new -key localdev.key -out localdev.csr

Beantwoord vervolgens de vragen met je eigen informatie. Let op dat de Common Name niet gelijk hoeft te zijn aan de domeinnaam die je wilt gebruiken. Deze worden straks door de SAN extensie afgehandeld.

Country Name (2 letter code) []:NL
State or Province Name (full name) []:Overijssel
Locality Name (eg, city) []:Vroomshoop
Organization Name (eg, company) []:Elitelabs
Organizational Unit Name (eg, section) []:Elitelabs Engineering
Common Name (eg, fully qualified host name) []:
Email Address []:info@elitelabs.nl

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:

4. Lokaal certificaat maken

We zijn nu klaar en kunnen ons certificaat maken. Let op dat tegenwoordig certificaten maximaal 365 dagen geldig mogen zijn. Als je deze waarde verhoogd, zal deze afgewezen worden door je browser.

openssl x509 -req -in localdev.csr \
-CA rootCA.crt \
-CAkey rootCA.key \
-CAcreateserial \
-out localdev.crt \
-days 365 \
-sha256

Nadat je de opdracht gegeven hebt, moet je het wachtwoord invullen van je RootCA en het certificaat wordt gemaakt.

Controleer dat je de volgende bestanden nu hebt:

  • localdev.csr - Certificate Signing Request
  • localdev.key - Private key voor het lokale certificaat
  • localdev.crt - Het lokale certificaat

RootCA installeren op de lokale machine

Globaal moet je ervoor zorgen dat jouw lokale systeem het zojuist gemaakte RootCA vertrouwd. Dit kan verschillen per machine.

MacOs

  1. Open de Keychain Access.app
  2. Klik links op 'login'
  3. Klik op 'Bestand' en dan 'Importeer items...'
  4. Kies het bestand /etc/apache2/ssl/rootCA.crt
  5. Zoek de RootCA op in de lijst met certificaten en dubbelklik hierop.
  6. Open de 'Trust' sectie en pas deze aan zoals onderstaande afbeelding
Eigen RootCA certificaat vertrouwen op lokaal systeem

Sluit het venster. Mogelijk is dat je dit moet bevestigen met je eigen wachtwoord.

Linux

todo

Windows

todo

Apache configuratie

#
# Non-SSL, permanent redirect to SSL
#
<VirtualHost *:80>
  ServerName localdomain1.int
  Redirect permanent "/" "https://localdomain1.int/"
</VirtualHost>

#
# SSL host, using certificates
#
<VirtualHost *:443>

# ... 
  ServerName localdomain.int

# ...
  SSLEngine on
  SSLCertificateFile /etc/apache2/ssl/localdev.crt
  SSLCertificateKeyFile /etc/apache2/ssl/localdev.key

</VirtualHost>