Zertifikate erstellen

openssl_logoWozu? Zertifikate sind nützlich. Mit ihnen kann z.B. eine VPN Verbindung oder auch eine http Verbindung verschüsselt werden.
Wie? Ganz schnell mit easy-RSA.

Hier ist eine einfache Methode beschrieben Zertifikate und Schlüssel zu erstellen.

Aber auch hier noch einmal der Hinweis für Vertrauenswürdige Zertifikate von https://letsencrypt.org

 

Ein Zertifikat besteht immer aus einer öffentlichen Root Zertifikatsdatei (ca.crt) mit einem Schlüssel (ca.key), den nur der Unterzeichner besitzt und einem .crt Zertifikat für den jeweiligen Rechner mit dazugehörigem .key den nicht jeder haben sollte. 😉
(Genaueres dazu? Stichwort: ‚Asynchrone Verschlüsselung‘)

openvpn_logoEs gibt wieder verschiedenste Wege Zertifikate zu erstellen. Ein einfacher ist dabei easy-rsa.

Nachtrag:
Eigentlich geht es über die

Easy-rsa war einmal bestandtteil von openvpn – ist aber mittlerweile ein eigenständiges Paket. Es besteht aus einer Sammlung von Scripts und Konfugurationsdateien die einem das Erstellen sehr leicht machen.
erst einmal prüfen, ob es schon installiert ist.
dpkg -l easy-rsa
…wenn nicht reicht ein schnelles apt-get install easy-rsa oder man holt es direkt vom Erzeuger https://github.com/OpenVPN/easy-rsa 😉
Dann kanns auch schon losgehen.

Vorbereitung

Der Befehl make-cadir in Verbindung mit einem Verzeichnisnamen erstellt ein Verzeichnis mit Links zu einer Sammlung von Scripts, die bei der Erstellung eines Zertifikates helfen. (Diese können auch von Hand kopiert werden. Sie sind unter /usr/share/easyrsa zu finden.)

make-cadir rsa && cd rsa

in dem so erzeugtem Verzeichnis (rsa) in dem wir uns jetzt befinden liegen jetzt auch die Links zu den build Scripts und die kopierten KonfigurationsDateien.

Die vars Datei

Jetzt können in der Datei ‚vars‘ einige Anpassungen vorgenommen werden. Die Stelle „#increase this to 2048 if you are paranoid …“ finde ich hier schonnmal gut.
Da sie später öfter abgefragt werden ist es hilfreich, zumindest die folgenden Parameter anzupassen um sie nicht ständig neu eingeben zu müssen:

export KEY_COUNTRY="EO"
export KEY_PROVINCE="CA"
export KEY_CITY="Irgendwo"
export KEY_ORG="Staff_Basement"
export KEY_EMAIL="admin@debian-server.lan"

Richtig erkannt. Hier werden Umgebungsvariablen angepasst.
Genaueres zu RSA Script Konfiguration hier.
Wer seinen Coutry oder Province Code nicht kennt…

Die openssl.cnf

Es liegen verschiedene Versionen der openssl.cnf vor die gewünschte wird auch durch das whichopensslcnf Script festgelegt (weil es so in der vars Datei festgelegt wurde).
Falls vorhanden wird eine openssl.cnf verwendet. Diese vorliegenden Versionen sind auch sehr gut kommentiert.
Es gibt sogar zu dieser Konfiguration eine Manpage: man 5 config
Normalerweise sind keine Änderungen an der Konfiguration nötig – aber natürlich auch nicht ausgeschlossen.
Das ist wieder ein eigenes Kapitel. https://www.openssl.org/

Erstellung

Nach Anpassung der vars Datei mit dem Source Befehl die vars Datei einlesen.

source ./vars

(Der Befehl source bewirkt, dass die Befehle aus der Datei in der aktuellen Konsolensitzung ausgeführt werden und die Umgebunsvariablen dann hier verfügbar sind.)
Netterweise wird einem dann folgendes mitgeteilt:
NOTE: If you run ./clean-all, I will be doing a rm -rf on /root/rsa/keys
Also falls noch alte keys da liegen jetzt in Sicherheit bringen. Dann:

./clean-all

was keine weitere Ausgabe erzeugt.

Server Zertifikate

 

Root Zertifikat

./build-ca

Ruft nun das Script zur Erstellung des Root Zertifikats auf.
Dies fragt noch einmal einige Variablen ab. Wie gut, dass die schon angepasst wurden.
Mit Enter werden die Einstellungen aus der vars Datei übernommen.
Dadurch wird ein neues Verzeichnis „keys“ mit den Dateien ca.crt und ca.key erstellt.
Das ca Zertifikat (Root Zertifikat) sollte für alle zugänglich sein, die Clientzertifikate haben oder erstellen möchten.
Die ca.key Datei sollte nach Signierung der Zertifikate gut versteckt werden! Sie wird nur benötigt, um neue Zertifikate zu signieren (nicht zum erstellen!).

Server Zertifikat

So, jetzt das Script zum Erstellen des Server Zertifikats und Schlüssels ausführen:

./build-key-server debian-server

Hier wird auch im Gegensatz zu ‚build-key‘ wird ’ns-cert-type‘ hier auf ’server‘ gesetzt. Kann in der Clientkonfiguration angegeben werden, um noch einmal sicher zu gehen, dass dies crt auch wirklich der im Zertifikat gewollte Server ist. (Stichwort: mitm – Schweinchen in der Mitte)
dabei die Vorgegebenen Variablen einfach wieder mit Enter übernehmen. Common Name muss eindeutig sein ab besten einfach den Hostnamen als Argument der Befehlszeile – hier z.B. ‚debian-server‘. Sollte aber auch automatisch vorgegeben sein.
Die ‚extra‘ atrributes challenge password und optional company Name werden nicht benötigt. Einfach leer lassen. (Kann benutzt werden, wenn das Zertifikat von einer anderen Stelle signiert wird und diese dazu ein Passwort haben möchte.)
Dann wird uns noch mit ‚Using configuration from …/openssl-x.x.x.cnf‘ mitgeteilt, welche openssl Konfiguration genutzt wird.

Jetzt noch 2x bestätigen, dass das Zertifikat signiert werden soll.
So Serverzertifikat fertig.

Hiermit kann dann auch schon eine http Verbindung verschlüsselt werden.
Für eine VPN braucht man noch etwas mehr:

Diffie-Hellman

Ist kein Zertifikat sondern sorgt beim Verbindungsaufbau für Sicherheit beim ersten Schlüsselaustausch. Ganz einfach:

./build-dh

..+.+Dauert ein bisschen. Es sucht jetzt eine ziemlich große Primzahl.

Zertifikatsdateien – Server

Im Ordner keys sollten jetzt diese (oder ähnliche) Dateien zu finden sein:

ca.crt
ca.key
debian-server.crt
debian-server.key
dh2048.pem

Davon sollte die ca.key gut weggeschlossen werden. sie wird nur gebraucht, um neue Zertifikate zu signieren.

Client Zertifikate

Alle VPN Clients brauchen vom Server die ‚ca.crt‘ (NICHT die ca.key!).
Mit der ca.crt kann auch der Client selbst (unsignierte) Zertifikate erstellen (Requests .csr). Da diese von uns eh noch signiert werden müssten (ca.key) und wahrscheinlich nur Zertifikate an bekannte Nutzer vergeben, können diese aber auch einfach auf dem Server erstellt, direkt signiert und dann auf sicherem Weg verteilt werden. Wenn du doch ein Request verschicken willst und die ca.crt besitzt, erstellst du ihn mit ./build-req dein_common_name dann sende die erstellte ‚dein_common_name.csr‘ an den Unterzeichner. – Dazu auch noch ein Wort bei der Übertragung.

Erstellung auf dem Server:
Bei Erstellung des Zertifikates auf dem Server muss die .key Datei dem Client geschickt werden. Die sollte außer ihm auch niemand besitzen. Daher gut überlegen, wie sie verschickt wird.
Das Problem kann behoben werden, wenn der Client sein Zertifikat selbst erstellt. Dabei müssen nur die unkritischen .csr und .crt Dateien ausgetauscht werden.
Da ja alles schon vorbereitet ist (bei einer neuen Terminalsitzung muss noch einmal das Script source ./vars ausgeführt werden da die Umgebungsvariablen nur für diese Terminalsitzung gelten.)

./build-key-pass debian-client

ausgeführt werden. Wenn dem vor Verbindungsaufbau vom Client noch ein Passwort abgefragt werden soll (Laptop?)
ODER

./build-key debian-client

wenn er sich sich ohne Passwortabfrage verbinden darf. (Home Desktop?)
Die Abfragen dem Client entsprechend anpassen. Der ‚Common Name‘ ist wieder wichtig und sollte am besten wie schon beim Server der Hostname des Clients oder ein eindeutiger Name sein.

Zertifikatsdateien – Client

ca.crt
debian-client.crt
debian-client.key

Mit der ca.crt kann der Client selbst neue Zertifikate erstellen und zur Signierung einreichen.
Vorsicht beim übertragen der Key Datei! Irgendwie auf sicherem Weg zum Client schicken. (PGP, USB, Brieftaube, …)

Mit Server und Clientzertifikat + dh kann man jetzt z.B. einen VPN Tunnel aufbauen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

− eight = one