Wenn man seine eigenen Dienste mit SSL/TLS absichern möchte benötigt man Zertifikate. Inzwischen gibt es auch kostenlose Zertifikate, diese haben aber Einschränkungen. Wenn man dynDNS verwendet bekommt man keine offizellen Zertifikate, da man nicht der Eigentümer der Domain ist. Oft hat jeder Dienst, den man anbietet auch einen eigene Subdomain. Wenn man mehrere Subdomains auf dem selben Port benötigt man ein Wildcard-Zertifikat1. Dieses ist nach meinen Kenntnisstand nicht kostenlos zu bekommen.
Wenn man nicht nur einen Webserver, sondern auch einen Jabber-Server betreibt lohnt es sich eine eigene CA (Certificate Authority) betreiben, mit der man alle seine Zertifikate unterschreibt. Damit alle Clients der CA vertrauen muss diese nur bekannt machen. Danach wird allen Zertifikaten vertraut, welche von der CA unterschrieben wurden.
Ein weiterer Vorteil: Mit der eigenen CA ist man im Zweifel auf der sicheren Seite. In den letzten Jahren ist es öfter vorgekommen, dass gefälschte Zertifikate im Umlauf waren. Es gibt also Gründe den großen CAs zu misstrauen2.
Certificate Authority erstellen
Als erstes muss man einen geheimen privaten Schlüssel generieren:
openssl genrsa -aes256 -out ca-key.pem 4096
Der Schlüssel wird in der Datei ca-key.pem
gespeichert und hat eine Länge von 4096 Bit. Man kann auch einen
längeren bzw. kürzeren Schlüssel erzeugen. 2048 Bit sehe ich als absolutes Minimum an. Durch Verwendung der
Option -aes256
wird der Schküssel mit einem Passwort geschützt. Der Schlüssel der CA muss besonderst
geschützt werden, denn mit ihm könnte sich ein Angreifer beliebige Zertifikate ausstellen. Die Verschlüsselung
mit einem Passwort bietet einen zusätzlichen Schutz. Das Passwort muss man bei jeder Verwendung des Schlüssels
eingeben.
Als nächstes muss man das root-Zertifikat der CA erzeugen. Dieses kann man dann in die Browser und in die Betriebssysteme importieren. Das Zertifikat wird wie folgt generiert:
openssl req -x509 -new -nodes -extensions v3_ca -key ca-key.pem -days 3650 -out ca-root.pem -sha512
Dieses Zertifikat hat eine Gültigkeit von 10 Jahren (3650 Tage). Die Attribute der CA können wie folgt sein:
Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:Saxony-Anhalt
Locality Name (eg, city) []:Halle (Saale)
Organization Name (eg, company) [Internet Widgits Pty Ltd]:bude
Organizational Unit Name (eg, section) []:IT
Common Name (eg, YOUR name) []:example.net
Email Address []:meine.email-adresse.net
Root-Zertifikat auf den Clients importieren
Debian / Ubuntu
sudo cp ca-root.pem /usr/share/ca-certificates/myca-root.crt
sudo dpkg-reconfigure ca-certificates
Mozilla Firefox / Thunderbird
Mozilla Firefox verwaltet Zertifikate selbst. Ein neues Zertifikat wird importiert unter Einstellungen => Erweitert => Zertifikate => Zertifikate anzeigen => Zertifizierungsstellen => Importieren. Wählt die Datei ca-root.pem
aus. Wählt die Option Dieser CA vertrauen, um Websites zu identifizieren.
Chromium / Google Chrome
Einstellungen => Erweiterte Einstellungen anzeigen (unten) => HTTPS/SSL => Zertifikate verwalten => Zertifizierungsstellen => Importieren => ca-root-pem
auswählen => Diesem Zertifikat zur Identifizierung von Websites vertrauen
Ein neues Zertifikat ausstellen
Als erstes muss man sich wieder einen privaten Schlüssel erzeuge.
openssl genrsa -out cert-key.pem 4096
Bei den Zertifikaten sollte man in den meisten Fällen kein Passwort setzten. Wenn man es z.B. für einen Webserver benötigt, dann müsste man das Passwort bei jedem Start eingeben.
Nun muss man eine Zertifikatsanfrage erstellen. Ganz wichtig ist der Common Name dieses Attribut muss so lauten, wie der Hostname des Servers, auf den es ausgestellt ist. Wenn man nur via IP zugreifen möchte, dann ist der Common Name die IP, mit den man den Dienst ansprechen möchte. Es sind auch Wildcard-zertifikate möchte *.example.com gilt für foo.example.com bar.example.com, aber nicht für foo.bar.example.com.
openssl req -new -key cert-key.pem -out cert.csr -sha512
Wenn man fertig ist, dann erhält man die Zertifikatsanfrage in cert.csr
, die kann von CA weiter verarbeitet werden. Dabei wird der öffentliche
Schlüssel des angefragten Zertifikats.
Mit der root-CA, deren Schlüssel und der Zertifikatsanfrage erstellt man ein signiertes Zertifikat, welches 1 Jahr gültig ist.
openssl x509 -req -in cert.csr -CA ca-root.pem -CAkey ca-key.pem -CAcreateserial -out cert-pub.pem -days 365 -sha512
Openssl fragt nach dem dem Passwort der root-CA. Wenn dan signierte Zertifikat erstellt wurde kann man die Zertifikatsanfrage cert.csr
löschen.
Das öffentliche Zertifikat befindet sich in der Datei cert-pub.pem
.
Das Zertifikat benutzen
Für einen Webserver benötigt man die folgenden 3 Teile:
- Privater Schlüssel des Zertifikats
cert-key.pem
- Öffentlicher Schlüssel des Zertifikats
cert-pub.pem
- Öffentlicher Schlüssel der CA
ca-root.pem
Je nach Server ist es nötig die CA und den öffentlichen Schlüssel in einer Datei zu haben. Das kann man wie folgt machen:
cat ca-root.pem >> cert-pub.pem
wenn sie SNI nicht unterstützen. Eine weitere Alternative sind SAN-Zertifikate (diese sind auf mehrere Subdomains ausgestellt), diese gibt es auch nicht für lau.