Eigen certificaten uitgeven m.b.v. OpenSSL

OpenSSL, DE tool als het gaat om versleuteling en certificaten. SSL is een veel gebruikte term in applicaties als het gaat om beveiliging. Veel client-server applicaties ondersteunen het, maar hoe gebruik je het nu precies? Wat moet je precies doen als je je eigen thuisserver op een veilige manier wilt kunnen benaderen via Internet met behulp van SSL verbindingen? Hieronder wordt op een praktische manier antwoord gegeven op deze vraag.

Voordat men certificaten kan uitgeven, moet men eerst een omgeving opzetten van waaruit deze certificaten uitgegeven worden. Zo'n omgeving heet een CA, een Certificate Authority. Het opzetten van een serieuze CA voor een bedrijf is een grote organisatorische klus, maar een CA voor eigen persoonlijk gebruik is met OpenSSL een koud kunstje.

Het inrichten van de CA

In het hieronder besproken voorbeeld wordt uitgegaan van een Unix omgeving voor de inrichting van de CA.

De configuratie

Begin met het installeren van OpenSSL. Na de installatie kan begonnen worden met de configuratie van OpenSSL. Meestal wordt er bij de installatie van OpenSSL vanuit een Linux distributie of BSD variant al een default configuratiefile meegegeven (bijv. /etc/ssl/openssl.cnf). Hieronder de instellingen zoals die in de rest van dit document gebruikt worden:
# OpenSSL example configuration file.
#
[ ca ]
default_ca = MyCA                      # De standaard CA sectie

[ MyCA ]
dir = /etc/ssl                         # Waar alles opgeslagen ligt
certs = $dir/certs                     # Waar de uitgegeven certificaten staan
crl dir = $dir/crl                     # Waar de uitgegeven CRL staat
database = $dir/index.txt              # Database indexfile
new certs dir = $dir/newcerts          # Plek voor nieuwe certificaten
certificate = $dir/ca_cert.pem         # Het CA certificaat
serial = $dir/serial                   # Het huidige certificaat serienummer
crl = $dir/crl.pem                     # De huidige CRL
private key = $dir/private/ca_key.pem  # De private key van de CA
RANDFILE = /dev/urandom                # Private random number file
x509 extensions = user_cert            # De x509 uitbreidingen
default days = 3650                    # Geldigheidsduur van een certificaat
default crl days = 30                  # Geldigheidsduur van een CRL
default md = sha1                      # Standaard md

[ user_cert ]
crlDistributionPoints = URI:http://www.mydomain.com/ca.crl
basicConstraints=CA:FALSE
nsComment = "OpenSSL Generated Certificate"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer:always
Maak in /etc/ssl/ de files index.txt en serial aan. Zet in de file serial de waarde "01" (zonder haakjes). Dit is het serienummer van het eerste certificaat dat vanuit deze CA wordt uitgegeven. Het serienummer 0 is gereserveerd voor het certificaat van de CA zelf.

Het aanmaken van de rootsleutel en het rootcertificaat

Het aanmaken van de CA begint met het creëren van een sleutelset. Volgens de OpenSSL handleiding wordt met het commando
openssl genrsa -out ca_key.pem 1024
een, in dit geval 1024 bits, geheime RSA sleutel aangemaakt. Uiteraard is het maken van alleen een geheime RSA sleutel een onzinnige handeling. Er hoort namelijk ook een publieke sleutel bij aangemaakt te worden. Bekijken we echter de inhoud van ca_key.pem met
openssl rsa -in ca_key.pem -text -noout
dan zien we dat er niet alleen een geheime sleutel, maar een set priemgetallen is aangemaakt die gebruikt kan worden voor de creatie van een geheime en de bijbehorende publieke sleutel. De publieke sleutel (welke we nu niet direkt nodig hebben) wordt met het volgende commando uit de set priemgetallen berekend:
openssl rsa -in ca_key.pem -pubout
Voor het gemak beschouwen we de inhoud van dit bestand toch als de geheime sleutel. Omdat het hier de geheime sleutel van de CA betreft, spreken we hier over de rootsleutel. Deze rootsleutel plaatsen we zoals aangegeven in de configuratiefile (in dit voorbeeld in /etc/ssl/private/). Het is van groot belang dat de rootsleutel niet in handen valt van anderen. Deze sleutel is dus strikt geheim! Zorg dat de rechten van het bestand goed staan (chmod 400 ca_key.pem).

Voor de CA is er naast een sleutelset ook een certificaat nodig. Deze wordt door de CA zelf ondertekend, dus met behulp van de rootsleutel. Dit gebeurt als volgt:
openssl req -new -x509 -key ca_key.pem -out ca_cert.pem
De inhoud van het certificaat kan bekeken worden met:
openssl x509 -in ca_cert.pem -text -noout
Dit certificaat, het rootcertificaat, moet vervolgens op een openbare plek worden opgeslagen, omdat met dit certificaat alle certificaten die vanuit deze CA worden uitgegeven op geldigheid kunnen worden gecontroleerd. Het handigste is om de publieke kopie van het certificaat te hernoemen naar een .crt bestand, zodat browsers deze dan makkelijker herkennen als zijnde een certificaat.

CRL genereren

Een CRL, Certificate Revokation List, is een lijst waarin alle certificaten staan die voortijdig ongeldig zijn verklaard, dus al ongeldig zijn voor de in het certificaat opgeslagen geldigheidsdatum. Een CRL kan als volgt gegenereerd worden:
openssl ca -gencrl -out ca.crl
Zo'n CRL dient, net als het rootcertificaat, op een openbare plek opgeslagen te worden. Certificaten die voortijdig ongeldig raken, kunnen worden ingetrokken met het volgende commando:
openssl ca -revoke user.crt
Alle door de CA uitgegeven certificaten bevinden zich in /etc/ssl/newcerts. Uiteraard zal na het intrekken van een certificaat de CRL opnieuw gegenereerd moeten worden.

Gebruikers certificaten

Het aanmaken van een gebruikercertificaat

Een toekomstige gebruiker maakt eerst met het volgende commando een eigen geheime sleutel (lees: set priemgetallen) aan:
openssl genrsa -out user_key.pem 1024
Vervolgens wordt er een, volgens de PKCS#10 standaard, certificaat-aanvraag gemaakt, een Certificate Signing Request (CSR). Dit houdt in dat een gebruiker een CA verzoekt om de publieke sleutel van de gebruiker te ondertekenen. Dit gebeurt door middel van:
openssl req -new -key user_key.pem -out user.csr
Er wordt aan de gebruiker een aantal vragen gesteld, zoals naam en emailadres, die beantwoord dienen te worden. De uitvoer van het CSR commando, de file user.csr, wordt naar de CA opgestuurd. De CA bekijkt de gegevens in de CSR op de volgende manier:
openssl req -in user.csr -text -noout
Als de gegevens goedgekeurd zijn, kan het certificaat met het volgende commando ondertekend worden:
openssl ca -in user.csr -out user.crt
De uitvoer hiervan, user.crt, wordt naar de gebruiker teruggestuurd. Deze kan het ontvangen certificaat samenvoegen met zijn of haar geheime sleutel tot een PKCS#12 bestand. Dit gebeurt door middel van:
openssl pkcs12 -in user.crt -inkey user_key.pem -export -out user.p12
Zo'n PKCS#12 bestand kan in Windows geïmporteerd worden zodat applicaties, zoals bijvoorbeeld een webbrowser of een e-mailclïent, gebruik kunnen maken van het certificaat en de geheime sleutel.

Een certificaat voor een serverapplicatie aanmaken

Ook een serverapplicatie (bijv. een webserver of een POP3/IMAP server) die gebruik kan maken van SSL verbindingen, kan op deze manier van een eigen certificaat voorzien worden. Er wordt, zoals hierboven beschreven, een geheime sleutel en een CSR aangemaakt. Bij het invullen van de gegevens bij een CSR, moet bij het veld CommonName, waar je als gebruiker je eigen naam invult, de hostname van de server waar de applicatie op draait ingevuld worden. Een clientapplicatie controleert namelijk of deze overeenkomt met de naam in het certificaat.

Het door de CA teruggestuurde certificaat wordt, voor gebruik door een applicatie, niet omgezet naar een PCSK#12 bestand. De geheime sleutel en het certificaat worden samengevoegd in een nieuw bestand. De inhoud van dit bestand ziet er dan als volgt uit (let op de lege regel aan het eind van beide blokken):
-----BEGIN RSA PRIVATE KEY-----
[de gecodeerde private key]
-----END RSA PRIVATE KEY-----

-----BEGIN CERTIFICATE-----
[het gecodeerde certificaat]
-----END CERTIFICATE-----

Zo'n bestand kan dan gebruikt worden door bijvoorbeeld Apache of STunnel. Indien in een browser het rootcertificaat ingestalleerd is, wordt ook dit certificaat direct geaccepteerd.