Ein SSL Zertifikat erstellen

Schritt-für-Schritt-Anleitung zum Erstellen, Signieren und Einbinden eines eigenen SSL Zertifikates.

vor 9 Jahren veröffentlicht unter Hacking Kryptographie.

Seit einiger Zeit bin ich dabei, alle meine Webseiten von HTTP auf HTTPS umzustellen. Dazu gehört auch, ein SSL-Zertifikat mit dazugehörigem "Certificate Signing Request" zu erstellen, das Zertifikat (signieren zu lassen|selbst zu signieren) und anschließend im Webserver einzubinden. Ich werde in diesem Blogpost meine Vorgehensweise beschreiben, vielleicht hilft es ja dem ein oder anderem bei der Umstellung seiner Webseiten auf HTTPS.

Vorbereitung

Zum Erstellen der Zertifikate benutze ich das Tool OpenSSL unter Ubuntu 14.04. Installiert wird OpenSSL mit folgendem Befehl:

$ sudo apt-get install openssl

Zur Vereinfachung weise ich den Domainnamen für den ich das Zertifikat ausstellen möchte meistens einer Variable zu, so kann ich die Befehle einfach per Copy & Paste ausführen, da ich die Domain nicht manuell austauschen muss.

$ CERT=www.example.com

Schritt 1 - SSL Zertifikat generieren

Zuerst generieren wir den privaten Schlüssel des Zertifikats, diesen Schlüssel solltest du sicher aufbewahren und niemals herausgeben.

$ openssl genrsa -out $CERT.key 4096
Generating RSA private key, 4096 bit long modulus
...........................++
.....................................................++
e is 65537 (0x10001)

Die Datei www.example.com.key ist nun unser privater Zertifikatsschlüssel.

Schritt 2 - Certificate Signing Request generieren

Zum Signieren des Zertifikates von einer Zertifizierungsstelle (oder dir selbst) benötigst du einen Certificate Signing Request (CSR). Während der Erstellung wirst du nach verschiedenen Informationen gefragt, am wichtigsten ist hier der Common Name, dieser muss genau der Domain entsprechen für die das Zertifikat ausgestellt werden soll. In meinem Beispiel ist das www.example.com, mit *.example.com kannst du auch ein Wildcard-Zertifikat erstellen, das für alle Subdomains von example.com gültig wäre.

$ openssl req -new -key $CERT.key -out $CERT.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:Rheinland-Pfalz
Locality Name (eg, city) []:Trier
Organization Name (eg, company) [Internet Widgits Pty Ltd]:nightsi.de
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:www.example.com
Email Address []:

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

Die Datei www.example.com.csr ist nun unser Certificate Signing Request (CSR).

Schritt 3 - Zertifikat signieren

Hier hat man zwei Möglichkeiten:

  1. Man lässt das Zertifikat von einer Zertifizierungsstelle signieren, die von den meisten Browsern als vertrauensvoll eingestuft wurde.
  2. Man signiert das Zertifikat mit einer eigenen Root-CA, was dazu führen kann, dass Browser eine Warnung auf eine möglicherweise unsichere Verbindung anzeigen.

Zertifizieren bei einer Zertifizierungsstelle

Zum Zertifizieren meiner SSL-Zertifikate verwende ich den kostenlosen Service vom StartSSL. Da die Root CA von StartSSL in den meisten Browsern als vertrauenswürdig eingestuft ist, lässt sich die Webseite ohne den Hinweis auf eine möglicherweise unsichere Verbindung besuchen.

Nachdem man dort seine Certifcate Signing Request hochgeladen hat, erhält man das signierte Zertifikat sowie die Zertifikate der verwendeten Certificate Authorities. Zum Einbinden in den Webserver braucht man alle diese Zertifikate.

Zertifizieren mit der eigenen Root-CA

Root-CA erstellen

Um das Zertifikat mit der eigenen Root-CA zu signieren, erstellen wir erst eine Root-CA und signieren sie mit sich selbst. Sollte man bereits eine eigene Root-CA haben, kann man diesen Schritt überspringen.

$ openssl genrsa -out root-ca.key 4096 -des3
Generating RSA private key, 4096 bit long modulus
..................++
..............................++
e is 65537 (0x10001)

$ openssl req -x509 -new -nodes -key root-ca.key -days 720 -out root-ca.crt
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:Rheinland-Pfalz
Locality Name (eg, city) []:Trier
Organization Name (eg, company) [Internet Widgits Pty Ltd]:nightsi.de
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:Max Mustermann
Email Address []:

Zertifikat signieren

Anschliessend können wir unser zuvor erstelltes Zertifikat signieren:

$ openssl x509 -req -in $CERT.csr -CA root-ca.crt -CAkey root-ca.key -CAcreateserial -out $CERT.crt -days 720
Signature ok
subject=/C=DE/ST=Rheinland-Pfalz/L=Trier/O=nightsi.de/CN=www.example.com
Getting CA Private Key

Importiert man das Root-Zertifikat root-ca.crt in seinen Browser, so werden alle mit dieser Root-CA signierten Zertifikate als vertrauenswürdig eingestuft.

Schritt 4 - Zertifkat einbinden

Um das Zertifikat mit einem Nginx-Webserver zu verwenden, muss man eine sogenannte Certificate Chain erstellen. Dabei werden die Zertifikate hintereinander in einer Datei abgelegt. Im Fall unseres selbst signierten Zertifikats sieht das folgendermaßen aus:

$ cat $CERT.crt root-ca.crt > $CERT.combined.crt

Wenn mehrere CAs an der Signierung beteiligt waren, können dort auch mehrere Zertifikate enthalten sein. Damit das Zertifikat vom Nginx-Webserver benutzt wird, musst du noch die Seitenkonfiguration um einen weiteren Server-Eintrag für SSL erweitern.

server {
  server_name www.example.com;
  listen [::]:443 ssl;

  ssl on;
  ssl_certificate /home/nightside/www.example.com.combined.crt;
  ssl_certificate_key /home/nightside/www.example.com.key;

  [...]

}

Zur Vereinfachung liegen die Zertifikate in meinem Beispiel noch im Home-Verzeichnis. Im Produktivbetrieb sollte man diese vielleicht woanders ablegen, zum Beispiel unter /etc/nginx/certs/.

Copy & Paste

Und hier noch einmal der komplette Vorgang zum Copy & Pasten:

CERT=www.example.com
openssl genrsa -out $CERT.key 4096
openssl req -new -key $CERT.key -out $CERT.csr
openssl x509 -req -in $CERT.csr -CA root-ca.crt -CAkey root-ca.key -CAcreateserial -out $CERT.crt -days 720
cat $CERT.crt root-ca.crt > $CERT.combined.crt
Willi Thiel

Geschrieben von Willi Thiel am 18. März 2015.



Kommentare

Sei der Erste, der einen Kommentar hinterlässt: