Wie man seine eigene Certificate Authority betreibt

So ziemlich jede und jeder nutzt täglich unzählige male verschlüsselte Verbindungen und hat somit auch mit Zertifikaten zu tun, meist natürlich unbewusst. Im Internet ist es inzwischen vollkommen selbstverständlich, dass Websites und andere Dienste auf diese Weise den Datenaustausch mit ihren Usern gegen Manipulation und fremden Zugriff absichern und ihre eigene Identität nachweisen. Doch wer daheim einen Webserver betreibt – also zum Beispiel einen Drucker mit Weboberfläche, ein NAS, eine IP-Kamera, einen Router, einen Raspberry Pi – hat sich meist schon an die Warnungen des Browsers gewöhnt, die auf unverschlüsselte Verbindungen, selbstsignierte oder abgelaufene Zertifikate oder Ähnliches hinweisen.

Glücklicherweise kann man das in Ordnung bringen und damit die Sicherheit im eigenen Netzwerk erhöhen und sich über ordentliche Schlösser im Browser freuen, indem man selbst Zertifikate erstellt und diese mit einer eigenen CA signiert. Was kompliziert und aufwändig klingen mag, ist in Wirklichkeit sehr einfach, sinnvoll und vor allem sehr lehrreich.

Wer sich intensiver für das Thema Verschlüsselung interessiert, dem sei dringend diese und diese Folge des Podcasts Request for Comments ans Herz zu legen.

Inhalt

Voraussetzungen

Grundsätzlich ist entscheidend, dass man die Geräte, die man mit Zertifikaten ausstatten will, über einen Hostnamen erreichen kann. Es muss also einen DNS-Server geben, wo man manuell Einträge vornehmen kann. Das könnte z.B. ein Router sein. Damit das sinnvoll ist, müssen die Geräte unveränderliche IP-Adressen haben oder die Adressen im DNS müssen bei Änderungen automatisch aktualisiert werden.

Außerdem sollte man einen Domainnamen besitzen. Solange man im lokalen Netzwerk ist, könnte man zwar auch *.local oder dergleichen nutzen, mehr Spaß macht es aber mit einer richtigen Domain und eine solche bietet ja auch viele andere Möglichkeiten. Beispielsweise hier kann man sich eine eigene Domain klicken.

Funktionsweise

Ein Zertifikat hat im Prinzip zwei Aufgaben:

  • Es weist nach, dass der Inhaber des Zertifikats die Gewalt über den Webserver bzw. die Domain hat. Ich habe beispielsweise keine Gewalt über die Domain google.com, daher würde mir keine vertrauenswürdige CA ein Zertifikat für google.com ausstellen. Das bedeutet, ich muss meinem Browser mitteilen, welchen CAs ich vertraue. Dazu komme ich später noch.
  • Es trägt den öffentlichen Schlüssel des Inhabers. Nur mit diesem können Daten entschlüsselt werden, die mit dem privaten Schlüssel verschlüsselt wurden und nur mit dem privaten Schlüssel kann entschlüsselt werden, was jemand mit dem öffentlichen Schlüssel verschlüsselt hat.

Zusätzlich muss man wissen, dass ein Zertifikat ein anderes Zertifikat kryptographisch signieren, also dessen Echtheit bestätigen kann.

Wie eine solche Public-Key-Kryptographie genau funktioniert wird im oben genannten Podcast, auf vielen Websites und in unzähligen YouTube-Videos erklärt und würde den Rahmen dieses Beitrags sprengen.

CA erstellen

Ich verwende als zentrales Tool die Open-Source-Software XCA.

Zuerst erstelle ich eine neue Datenbank, in der alle Schlüssel und Zertifikate abgelegt werden: Datei -> Neue Datenbank -> Speicherort und Namen wählen -> sicherses Passwort vergeben.

Es empfiehlt sich natürlich, die Datenbank gegen Verlust zu sichern und regelmäßig Backups davon anzulegen.

CA-Zertifikat erstellen

Danach erstelle ich unter Neues Zertifikat das erste Zertifikat, nämlich das der CA selbst. Dieses ist selbstsigniert, da ja keine weitere Instanz über der CA steht, die es signieren könnte. Bei Vorlage wähle ich [default] CA und klicke auf Alles übernehmen. Im Reiter Inhaber vergebe ich einen sinnvollen Namen und einen commonName. Daraufhin klicke ich auf Erstelle einen neuen Schlüssel und wähle 2048bit als Schlüssellänge. Alle anderen Felder in diesem Reiter sind optional.

Jetzt lege ich eine Gültigkeitsdauer von 10 Jahren fest. Das Zertifikat öfters zu erneuern macht keinen Sinn, außer der private Schlüssel ist abhanden gekommen. Ich erstelle das Zertifikat mit OK.

CA-Zertifikat veröffentlichen

Die gängigen Betriebssysteme sowie manche Browser bringen einen sogenannten Trust Store mit. Das ist eine Sammlung von CA-Zertifikaten von Certificate Authorities, die der Betriebssystem- bzw. Browserhersteller für vertrauenswürdig hält. Diese Sammlung wird über Updates gepflegt und vom CA/Browser Forum kuratiert. Würde eine CA beispielsweise mir ein Zertifikat für google.com ausstellen, würde diese CA in hohem Bogen aus dem CA/Browser Forum und den Trust Stores fliegen.

Damit unsere eigene private CA auch als vertrauenswürdig eingestuft wird, müssen wir das CA-Zertifikat einmalig bei allen Clients in den jeweiligen Trust Stores hinterlegen, die man benutzen möchte.

Dazu wähle ich in XCA das CA-Zertifikat aus und klicke auf Export. Ich wähle einen Speicherort und das Format PEM (*crt). Dieses Zertifikat beinhaltet nur den öffentlichen Schlüssel und kann daher bedenkenlos per Mail, über ein Netzlaufwerk oder über eine Website verteilt werden, sodass man es dann auf jedem PC, Smartphone usw. installieren kann.

Windows

Zertifikat herunterladen und doppelklicken -> Zertifikat Installieren -> Weiter -> Speicher: Vertrauenswürdige Stammzertifizierungsstellen -> Weiter -> Fertigstellen -> Ja

Jetzt öffne ich den Trust Store mit Win+R und certmgr.msc, um die Installation zu prüfen:

Firefox

Einstellungen -> Datenschutz & Sicherheit -> Zertifikate anzeigen -> Zertifizierungsstellen -> Importieren -> Zertifikat öffnen -> ersten Haken setzen -> OK -> OK

iOS

Zertifikat öffnen -> Zulassen -> Schließen -> Einstellungen -> Allgemein -> Profile -> Auswählen -> Installieren (x3) -> Fertig

Einstellungen -> Allgemein -> Info -> Zertifikatsvertrauenseinstellungen -> Schalter aktivieren -> Weiter

Andere Browser und Betriebssysteme

GIDF 😉

Serverzertifikate erstellen

Die eigene CA ist jetzt betriebsbereit und kann genutzt werden um Serverzertifikate zu erstellen. Der genaue Vorgang ist dabei von Gerät zu Gerät etwas unterschiedlich, im Prinzip gibt es aber zwei Methoden:

Idealerweise sollter der private Schlüssel eines Servers auf diesem erstellt werden und den Server niemals verlassen. Das geschieht, indem man am Server einen Certificate Signing Request (CSR) erstellt, das ist praktisch ein fast fertiges Zertifikat, das nur noch durch eine CA signiert werden muss.

Bei der anderen Methode wird das Schlüsselpaar durch die CA erstellt, das Zertifikat signiert und dann gemeinsam mit dem privaten Schlüssel auf den Server übertragen. Dabei sollte der private Schlüssel wenn möglich mit einem Passwort geschützt werden. Das ist zwar weniger sicher aber in manchen Fällen die einzige Möglichkeit.

Apache (mit CSR)

Zuerst wechseln wir an den Ort, wo das Zertifikat und der private Schlüssel laut der VirtualHost-Konfiguration abgelegt werden soll (z.B. /etc/ssl/) und führen dort folgenden Befehl aus, wobei server durch den FQDN des Servers ersetzt werden sollte.

sudo openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr

Danach kann man weitere Felder befüllen, wobei der commonName den FQDN enthalten muss:

Die Datei server.csr (im Beispiel dns-vie.resch.cloud.csr) kopiere ich auf meinen PC und importiere sie in XCA im Reiter Zertifikatsanträge. Dort klicke ich im Kontextmenü des Eintrags auf Unterschreiben. Dort kann ich nun das vorhin erstellte CA-Zertifikat zum Unterschreiben des Serverzertifikats verwenden. Außerdem wähle ich als Vorlage [default] HTTPS_server und klicke auf Alles übernehmen:

Das unterschriebene Zertifikat aus dem Reiter Zertifikate exportiere ich als *crt und kopiere es auf den Apache-Server. Abschließend starte ich apache neu und überprüfe das Ergebnis im Browser. Sollte apache nicht starten, stimmen wahrscheinlich die Dateiendeungen von privatem Schlüssel und Zertifikat in der VirtualHosts-Datei nicht.

sudo systemctl restart apache2

Hikvision IP-Kamera (mit CSR)

Unter Configuration -> Network -> Advanced Settings -> HTTPS klicke ich auf Create, gebe die nötigsten Daten ein und bestätige mit OK. Die Schlüsselerstellung kann je nach Rechenleistung der Kamera bis zu einer Minute dauern. Anschließend lade ich den CSR herunter und gehe zum Signieren wie oben vor.

Zum Importieren lade ich das signierte Zertifikat als .csr hoch und klicke auf Install. Abschließend muss noch der Haken bei Enable gesetzt und die Einstellung müssen gespeichert werden.

Zertifikate verlängern

Nähert sich ein Serverzertifikat seinem Ablaufdatum, kann man es mit einem Rechtsklick auf das Zertifikat ganz einfach verlängern und neu exportieren. Bei Webservern muss man dann nur das alte durch das neue Zertifikat ersetzen, der private Schlüssel bleibt unangetastet.

Andere Zertifikate

Neben Webservern kann man mit einer eigenen CA natürlich auch einfach Zertifikate für VPN-Server, für Clientauthentifizierung und viele andere Zwecke erstellen. Das ist aber Stoff für einen zukünftigen Beitrag.


Wenn du Feedback loswerden möchtest, nutze bitte das Kontaktformular. Falls dir mein Beitrag weitergeholfen hat, würde ich mich sehr über einen kleinen Kaffee freuen. Und falls du die Hetzner Cloud ausprobieren möchtest, bekommst du mit diesem Link 20€Guthaben geschenkt.


Schreibe einen Kommentar