Eigene Zertifikate mit openssl

Benötigt man einzelne TSL-Zertifikate für einen öffentlich erreichbaren Server, beispielsweise einen Web- oder Mailserver, so ist es empfehlenswert, das Certbot-Projekt zu nutzen.

Möchte man hingegen eine verschlüsselte Kommunikation zwischen verschiedenen Rechnern innerhalb eines lokalen Netzwerkes erreichen, so macht es durchaus Sinn, eine eigene Zertifizierungs-Stelle („Certificat Authority, kurz CA) zu betreiben: Zertifikaten, die man selbst erstellt hat, kann man guten Gewissens vertrauen.

Zum Erstellen eigener TLS-Zertifikate ist das Paket openssl nötig, das mittels des gleichnamigen Pakets installiert werden kann:

sudo aptitude install openssl

openssl wird üblicherweise mit mehreren Argumenten aufgerufen; eine gut navigierbare Übersicht bietet die offizielle Dokumentation.

Einrichten einer Zertifizierungs-Stelle (CA)

Um eigene Zertifikate ausstellen und signieren zu können, muss zunächst eine so genannte Zertifizierungs-Stelle (CA) erstellt werden. Dabei handelt es sich um ein spezielles Zertifikat, mit dessen Hilfe weitere Zertifikate signiert werden können.

Das CA-Zertifikat sollte nicht in falsche Hände geraten, denn damit könnten weitere Zertifikate ausgestellt und signiert werden, die wiederum von allen Clients im Netzwerk als glaubhaft eingestuft werden würden. Es ist daher ratsam, diese Datei mit einem Passwort-Schutz zu versehen. Dies kann man erreichen, indem für das CA-Zertifikat ein privater Schlüssel mit Passwort-Schutz erstellt wird:

# CA-Schlüssel erstellen:
openssl genrsa -aes256 -out ca-key.pem 4096

# Zugriffsrechte für den privaten Schlüssel einschränken:
chmod 600 ca-key.pem

Beim Erstellen des Schlüssels muss ein möglichst sicheres Passwort (oder ein Passwort-Satz) zweimal eingegeben werden. Dieses Passwort wird jedes Mal beim Erstellen eines neuen Zertifikats benötigt, es ist also empfehlenswert, das Passwort mit keepassx oder pass sicher und leicht wieder auffindbar zu verwahren.

openssl besteht aus mehreren Unterprogrammen; mit openssl genrsa wird beispielsweise ein neuer RSA-Schlüssel erstellt. Die Option -aes256 gibt den Verschlüsselungs-Mechanismus an (optional kann auch -sha512 verwendet werden), die Zahl 4096 die Länge des zu erstellenden Schlüssels. Durch den Aufruf dieser Anweisung wird im openssl-Verzeichnis eine neuer privater Schlüssel namens ca-key.pem erstellt (die Endung .pem ist sowohl für Zertifikate als auch für die entsprechenden Schlüssel üblich).

Ein weiteres wichtiges Unterprogramm ist openssl req, mit dem man einen Antrag für ein neues Zertifikat (Certificate Signing Request, kurz CSR) stellen kann. Mit der Option -key kann der zum künftigen Zertifikat gehörende (private) Schlüssel, mit der Option -out der Name des künftigen Zertifikats angegeben werden.

Zum Erstellen der CA wird ebenfalls openssl req verwendet, allerdings mit der zusätzlichen Option -x509. Diese Option bewirkt, dass ein selbst-signiertes Zertifikat anstelle einer gewöhnlichen Zertifikats-Anfrage ausgegeben wird:

# CA-Zertifikat erstellen:
openssl req -x509 -new -extensions v3_ca -key ca-key.pem \
        -out ca-cert.pem -days 3650

Beim Ausführen der obigen Anweisung erscheint ein Frage-Katalog. Die einzelnen Einträge sind weitgehend selbsterklärend: Als Country Name gibt man beispielsweise DE als Länderkennung für Deutschland ein. Für State or Province gibt man den Namen des Bundeslandes an, für Locality den Namen der Stadt, in deren Umfeld man wohnt (beziehungsweise die Firma/Domain angesiedelt ist, für die das Zertifikat erstellt werden soll). Als Organization Name gibt man den Namen der Firma oder den Namen der Domain an (meist ohne Endung). als Organization Unit Name kann man beispielsweise IT angeben. Als Common Name kann für das CA-Zertifikat der eigene Name angegeben werden.

Die Option -extensions v3_ca bewirkt, dass die Einstellungen aus der Datei /etc/ssl/openssl.cnf, die dort unter der Rubrik v3_ca aufgelistet sind, berücksichtigt werden. Über die Option -days 3650 wird festgelegt, dass das CA-Zertifikat eine Gültigkeitsdauer von zehn Jahren erhalten soll. Der Zeitraum ist deshalb so lange gewählt, da mit dem Ablauf des CA-Zertifikats auch alle damit signierten (normalen) Zertikate ihre Gültigkeit verlieren.

Es ist alternativ auch möglich, das Zertifikat und den privaten Schlüssel mit nur einer Anweisung zu generieren:

# CA-Zertifikat und Schlüssel auf einmal (optional):
openssl req -x509 -new -extensions v3_ca -newkey rsa:4096 -keyout ca-key.pem \
       -out ca-cert.pem -days 3650

Hierbei wir mittels -newkey rsa:4096 die Schlüssel-Länge angegeben, und mit -keyout ca-key.pem` der Name des zu erstellenden Schlüssels.

Das CA-Zertifikat entspricht dem „Public Key“ der Zertifizierungsstelle. Damit ein Rechner selbst erstellte Zertifikate ohne Warnungen akzeptiert, muss neben dem eigentlichen Zertifikat auch das CA-Zertifikat ca-cert.pem importiert werden.

Erstellung eines signierten Zertifikats

Auch für ein gewöhnliches Zertifikat, das für eine bestimmte Domain ausgestellt wird, muss zunächst wieder ein privater Schlüssel generiert werden:

openssl genrsa -out example-one-de-key.pem 4096

In diesem Fall soll der Schlüssel allerdings nicht mit einem Passwort versehen werden, denn ansonsten müsste beispielsweise bei jedem Neustart des Webservers, der das Zertifikat nutzt, ein Passwort für den Schlüssel eingegeben werden. Bei der Passwort-Nachfrage wird somit lediglich Enter eingegeben, also kein Passwort angegeben.

Anschließend wird mittels openssl req die eigentliche Zertifikats-Anfrage gestellt. Hierbei sollte nun der Name des Zertifikats in Anlehnung an den Namen der Domain gewählt werden, für die das Zertifikat bestimmt ist:

# Zertifizierungs-Request:
openssl req -new -key example-one-de-key.pem -out example-one-de-cert.csr

Wie beim CA-Zertifikat müssen auch hier Angaben zu Stadt, Land und Organisation gemacht werden. Besonders wichtig ist an dieser Stelle das Attribut Common Name: Hier muss in diesem Fall der Domain-Name des Servers angegeben werden, beispielsweise example-one.de. Die letzten beiden Angaben – das Challenge Passwort und der Optional Company Name – sind beide optional, können also leer gelassen werden.

Gibt man optional als Common Name anstelle von example-one.de *.example-one.de an, so wird ein so genanntes „Wildcard“-Zertifikat erstellt, das für alle Subdomains der angegebenen Domain gültig ist – jedoch nicht für die Domain selbst.

Zusätzlich zum Zertifikat muss ein öffentlicher Schlüssel erstellt werden; dieser wird zusammen mit dem privaten Schlüssel des Zertifikats für die TLS-Verschlüsselung benötigt. Ein solcher Schlüssel kann mittels der Anweisung openssl x509 erstellt werden:

openssl x509 -req -in example-one-de-cert.csr -CA ca-cert.pem -CAkey ca-key.pem \
            -CAcreateserial -out example-one-de-pub.pem -days 365

Hierbei wird das Passwort für das CA-Zertifikat benötigt.

Nach dem Ausführen der obigen Anweisungen existieren drei Dateien im aktuellen Verzeichnis: Der öffentliche Schlüssel (Endung -pub.pem), der private Schlüssel (Endung -key.pem), und die Anfrage-Datei (Endung .csr). Die Anfrage-Datei mit der Endung .csr wird nicht weiter benötigt, entscheidend sind die beiden .pem-Dateien.

Die Zertifizierungsanfrage zertifikat.csr kann gelöscht werden – sie wird nicht mehr benötigt. Übrig bleiben Private Key und Public Key des neuen Zertifikats (zertifikat-key.pem und zertifikat-pub.pem) sowie Private- und Public Key der CA (ca-key.pem und ca-root.pem)

Den privaten Schlüssel benötigt der HTTP-Server um den Traffic zu verschlüsseln. Dein Browser entschlüsselt das dann mit dem öffentlichen Schlüssel. Sendest du nun weitere Anfragen (GET, POST, PUT, etc..) werden diese mit dem öffentlichen Schlüssel verschlüsselt und der Server entschlüsselt diese mit dem Privaten. Ohne privaten Schlüssel ist also keine Kommunikation möglich.

Der Inhalt derartiger Dateien beginnt stets mit -----BEGIN CERTIFICATE----- und endet mit -----END CERTIFICATE-----.

Nach dem Erstellen muss das Zertifikat entweder selbst oder von einer externen Zertifizierungs-Stelle (CA) signiert werden.

# Eigenes Zertifikat erstellen
openssl x509

Man kann beide Schritte, also das Erstellen eines Schlüssels und eines Zertifikats, auch mit nur einer einzigen Anweisung erreichen, indem man openssl req mit der zusätzlichen Option -x509 aufruft und den Dateinamen des zu erstellenden Schlüssels mittels der Option -keyout angibt:

openssl req -new -x509 -keyout example-one.de.pem \
            -out example-one.de.pem -days 365 -nodes

Zertifikate aktivieren

Die Zertifikats-Stellen, denen der eigene Rechner vertraut, sind üblicherweies im Verzeichnis /usr/share/ca-certificates abgelegt. Zertifikate, die mittels dieser CAs erstellt wurden, werden von openssl im Verzeichnis /etc/ssl/certs abgelegt und dort zusätzlich in der Datei /etc/ssl/ca-certificates.crt zusammengefasst.

Welchen Zertifizierungs-Stellen vertraut wird, kann mittels dpkg-reconfigure ca-certificates neu konfiguriert werden:

sudo dpkg-reconfigure ca-certificates

Insbesondere kann somit das CA-Zertifikat als vertrauenswürdig eingestuft werden.