Christoph Polcin

Ein Certificate Signing Request mit OpenSSL erstellen

Um für die eigene In­ter­net­prä­senz bzw. Domain ein signiertes Zertifikat zu erhalten wird eine so genannte Zer­ti­fi­kats­re­gis­trie­rungs­an­for­de­rung / Cer­ti­fi­ca­te Signing Request CSR benötigt. Diese kann mit Hilfe von OpenSSL wie folgt erzeugt werden:

openssl req -nodes -new \
    -newkey rsa:4096 -keyout domain.tld.key \
    -out donain.tld.csr

Der Kom­man­do­zei­len­be­fehl generiert nach Eingabe not­wen­di­ger Daten einen 4096-Bit staken RSA Schlüssel den key und das benötigte CSR, welches an die Re­gis­trie­rung- / Zer­ti­fi­zie­rungs­stel­le wei­ter­ge­lei­tet werden muss. Im Falle von CACert.org ist lediglich das Eintragen des Common Name notwendig da die restlichen In­for­ma­tio­nen nicht be­rück­sich­tigt werden. Um ein Wildcard-Zertifikat zu erhalten muss Common Name die eigene Domain im folgenden Format enthalten *.domain.tld, sonst wird die konkrete Domain angegeben. Für das Über­mit­teln des CSR gibt es im CACert-Nut­zer­be­reich ein Ein­ga­be­for­mu­lar. Im nächsten Schritt steht das von der Zer­ti­fi­zie­rungs­stel­le signierte Zertifikat, oft codiert im Base64 Format, zur Verfügung und muss in eine Datei zum Beispiel domain.tld.crt eingefügt werden. Die digitale Signatur kann wie folgt an Hand der öf­fent­li­chen Schlüssel der Zer­ti­fi­zie­rungs­stel­le überprüft werden.

curl https://www.cacert.org/certs/root.crt -o CACert_root.crt
curl https://www.cacert.org/certs/class3.crt -o CACert_class3.crt

openssl verify -CAfile CACert_root.crt \
        -untrusted CACert_class3.crt \
        domain.tld.crt

Reicht für den Einsatz ein Selbst-Signiertes Zertifikat (Self-Signed Cer­ti­fi­ca­te) aus kann es unter Angabe des Ver­falls­da­tums in Tagen wie folgt erstellt werden:

openssl x509 -req -days 365 \
        -in domain.tld.csr \
        -signkey domain.tld.key \
        -out domain.tldcrt

Nun muss das signierte Zertifikat, der private Schlüssel und ggf. der öf­fent­li­chen Schlüssel der Zer­ti­fi­zie­rungs­stel­le über eine sicheren Kanal auf den eigenen Webserver übertragen werden. Der Apache Webserver verlangt den privaten Schlüssel in einer un­ver­schlüs­selt Form. Dabei hilft der folgend Befehl:

openssl rsa -in domain.tld.key -out domain.tld.key.decrypt

Die Kon­fi­gu­ra­ti­on des Webservers muss wie folgt angepasst werden:

<VirtualHost _default_:443>
    DocumentRoot /var/www/htdocs
    ServerName www.domain.tld
    SSLEngine on
    SSLCertificateFile /path/to/domain.tld.crt
    SSLCertificateKeyFile /path/to/domain.tld.key.decrypt
    SSLCertificateChainFile /path/to/CACert_class3.crt
</VirtualHost>

Nun steht einer sicheren Da­ten­über­tra­gung nichts im Wege. Der private Schlüssel sollte an einem ebenfalls sicheren Ort gut aufbewahrt werden.