Grundlagen
Wenn man einen eigenen Web- oder Mailserver betreibt, möchte man ihn über kurz oder lang auch über SSL ansprechen. Hier wird erklärt, wie man die dafür benötigten Zertifikate selbst erzeugt.
In dieser Anleitung verwende ich OpenSSL zum Erzeugen der Zertifikate. Die Pfadangaben sind die Standardpfade unter Debian.
Um die Zertifikate auszustellen, sind die folgenden vier Schritte notwendig:
- Ausstellen des Root-Zertifikats: Hier wird die Kombination aus öffentlichem und privatem Schlüssel angelegt.
- Signieren des Root-Zertifikats: Das root-Zertifikat wird durch sich sebst - also mit dem enthaltenen privaten Schlüssel - unterschrieben.
- Ausstellen der Anwendungs- bzw. Server-Zertifikate: Es werden die Schlüsselpaare erzeugt, die später zur Authentifizierung, Signatur oder für die SSL-Kommunikation verwendet werden.
- Signieren der Anwendungszertifikate: Die Anwendungszertifikate werden mit dem root-Zertifikat unterschrieben, um sie als valide zu kennzeichnen.
Schlüsselpaar für das Root-Zertifikat erzeugen
Zunächst benötigen wir ein Schlüsselpaar, also einen privaten und einen dazu passenden öffentlichen Schlüssel.
openssl genrsa -des3 -out /etc/ssl/private/myrootca.key 2048
Bei der Erzeugung sollte auf jeden fall ein starkes, d.h. schwer zu erratendes Passwort gewählt werden. Denn sollte jemand das root-Zertifikat "knacken", dann kann derjenige beliebige gültige Anwendungs-Zertifikate damit signieren und evtl. erheblichen Schaden anrichten.
Mit dem Passwort wird der private Schlüssel geschützt, so dass ihn nicht jeder verwenden kann. Das Passwort ist aber nicht selbst der private Schlüssel. Man kann auch ein leeres Passwort angeben, so dass der private Schlüssel nicht mehr geschützt ist. Das sollte man aber nur für Experimente machen, für den produktiven Einsatz sollte der private Schlüssel aber auf jeden Fall durch ein Passwort geschützt sein.
Signieren des Root-Zertifikats
Mit einem Schlüsselpaar allein kann man noch nichts angangen. Um aus einem Schlüsselpaar ein Zertifikat zu machen, muss es von einer vertrauenswürdigen Stelle signiert werden, die damit bestätigt, dass die an dem Zertifikat hängenden Informationen, also im Allgemeinen der Name des Besitzers bzw. des Servers tatsächlich demjenigen gehört, für den das Zerifikat ausgestellt wurde.
Bei einem root-Zertifikat gibt es natürlich keine noch weiter übergeordnete Stelle, die diese Signatur erzeugen kann. Also wird das root-Zertifikat mit dem eigenen privaten Schlüssel signiert.
Das Schlüsselpaar alleine zu signieren, genügt aber nicht, da niemand nachvollziehen könnte, wem die Schlüssel gehören, bzw. wessen Identität sie beweisen sollen. Dazu werden noch ein paar Informationen benötigt, die in einem Certificate Request abgelegt werden. Bei dessen Ausstellung wird unter anderem der Common Name abgefragt, der für den späteren Einsatzzweck besonders wichtig ist, da er bei einem Server-Zertifikat den Namen des Servers enthalten muss oder für ein E-Mail-Zertifikat die E-Mail-Adresse.
openssl req -new -key /etc/ssl/private/myrootca.key -out myrootca.req
Nun enthält das Request die Schlüssel- und die Identitätsinformationen und kann unterschrieben werden:
openssl x509 -req -days 7305 -sha1 -extensions v3_ca \
-signkey myrootca.key \
-in myrootca.req \
-out /etc/ssl/certs/myrootca.crt
In der Datei myrootca.crt
liegt nun das Root-Zertifikat mit dem öffentlichen
Schlüssel. Dieses Zertifikat kann und darf veröffentlicht werden. im Gegensatz
dazu muss das Schlüsselpaar in der Dateimyrootca.keyan einem sicheren Ort
bleiben und darf nicht veröffentlicht werden.
Erzeugen des Schlüsselpaars für das Anwendungszertifikat
Nun kann nach dem gleichen Verfahren wie für das root-Zertifikat ein Schlüsselpaar für das Anwendungszertifikat erstellt werden:
openssl genrsa -out /etc/ssl/private/myhost.key 2048
Signieren des Anwendungszertifikats
Und auch der Ablauf zum Ausstellen des Zertifikats ist der selbe wie beim root-Zertifikat, mit dem kleinen aber ganz wesentlichen Unterschied, dass das Anwendungszertifikat natürlich nicht mit dem eigenen Schlüssel, sondern mit dem des root-Zertifikats unterschrieben wird. Doch zunächst brauchen wir auch hier ein Cerificate Request:
openssl req -new -key myhost.key -out myhost.req
Nun kommt der wichtigste Schritt, die Signatur:
openssl x509 -req -days 3650 -sha1 -extensions v3_req \
-CA /etc/ssl/certs/myrootca.crt \
-CAkey /etc/ssl/private/myrootca.key \
-CAserial /etc/ssl/myrootca.srl \
-CAcreateserial \
-in myhost.req \
-out /etc/ssl/certs/myhost.crt
Damit ist das Anwendungszertifikat in der Datei myhost.crt
fertig und kann
verwendet werden.