Warum dieses HowTo?
Ich schreibe dieses HowTo, weil ich kein HowTo, hier, im VPNForum noch bei Onkel Google, ein Komplettes HowTo gefunden habe.
Es gibt immer nur HowTo's über OpenVPN oder OpenSSL, aber nie beides zusammen. Mein Ziel ist es, das jeder im nachhinein versteht was er durchführt und auch die einzelnen Syntaxpunkte von OpenSSL und OpenVPN, zumindest ein wenig, für sich verständlich erklären kann.
Vorraussetzungen
Ich fange nicht ganz von vorne an, selbst einem Neuling müsste Klar sein das er OpenVPN und OpenSSL installiert haben muss damit es überhaupt funktionieren kann.
Die Verzeichnisse die ich verwende können auch abweichen, ich gehe von meinem SuSe 9.3 aus.
OpenSSL
Wir beginnen damit uns die geeigneten Schlüsselpaare und Zertifikate zu erstellen. Verschlüsselungswerte sind, sagen wir mal so, Richtwerte die jeder für sich entscheiden kann wie er will.
Wir wechseln hierzu zunächst erstmal in unser OpenSSL Verzeichnis, bei mir ist das unter /etc/ssl/
Der übersicht halber erstellen wir das Unterverzeichnis "Zertifikate" wo wir später unsere ganzen erstellten Zertifikate ablegen. Es gibt zwar ein Standartverzeichnis für Zertifikate "certs", dieses ist sehr unübersichtlich später, da hier noch andere Skripte und Zertifikate liegen.
Danach schauen wir uns die openssl.cnf.
Um uns die spätere Arbeit ein wenig zu erleichtern, öffnen wir diese und berabeiten sie.
Hier stehen am Anfang einige Variablen mit Verzeichnissen, diese sollten wir anpassen, aufgrund späterer Arbeiten.
Code:
dir = . # Where everything is kept
hier unser Verzeichnis selbst (mit dem ".") angeben.
Code:
certs = $dir/Zertifikate # Where the issued certs are kept
diese Zeile anpassen um später unsere Zertifikate wieder zu finden und immer so weiter.
Nun kann ich alle Standartwerte editieren, damit ich nicht bei jedem Zertifikat alles neu Eingeben muss. Diese Werte findet ihr ab Zeile 123.
Dort steht dann zum Beispiel: CountryName_default = AU
das kann ich dann in CountryName_default = DE ändern.
Bei Punkten ohne ein "BlaBla_default" einfach so eine Zeile erstellen, ausser bei CommonName.
Der CommonName muss IMMER verschieden sein bei jedem Zertifikat, er darf also nur einmal vorkommen, dies kann sonst zu Problemen führen.
So jetzt fangen wir mit dem Schlüssel für unsere CA (Certificate Authority) an.
Code:
openssl genrsa -aes256 -out private/vpn-cakey.pem 2048
Mit openssl rufen wir die Prozedur auf,
genrsa generiert den Schlüssel,
-aes256 ist ein Verschlüsselungsalgorithmus für unsere Datei, hier kann auch eine andere Methode verwendet werden, jedoch ist dieser AES256 sehr sicher, er wird von der amerikanischen Regierung für vertrauliche Dokumente verwendet (Wikipedia: AES),
-out bennent/erstellt unsere Ausgabedatei und
2048 gibt an wieviel Bit Groß unser Schlüssel sein soll (hier gilt auch: 1024 reichen völlig aus).
Wenn wir diesen Befehl ausgeführt haben, werden wir aufgefordert ein Passwort einzugeben (Enter Pass Phrase for vpn-cakey.pem: ). Dieses Passwort brauchen wir später um unsere Zertifikate zu verifizieren.
unser nächster schritt erstellt unsere CA:
Code:
openssl req -new -x509 -days 3650 -key private/vpn-cakey.pem -out vpn-ca.pem -set_serial 1
req erstellt eine Anfrage ("Request"),
-new sagt uns das wir eine neue Anfrage schicken,
-x509 ist der verwendete Standart für unsere CA (Wikipedia: X509),
-days gibt die Gültigkeitsdauer unseres Zertifikats an,
-key unseren verwendeten "Masterschlüssel" zum erstellen der CA,
-set_serial startet unsere Seriennummern die später hochgezählt werden.
Nach ausführen des Befehls werden wir zu Angaben über uns Aufgefordert. Die Werte in Eckigen Klammern sind die Default Werte, welche wir vorhin verändert haben und diese können wir einfach mit der Enter-Taste bestätigen, ausser unseren Common Name, hier könnte man Bspw. "Server" eingeben.
Um das ganze schliesslich noch etwas sicherer zu machen entziehen wir unserem Ordner private/ noch die Zugriffsrechte:
Code:
chmod 0700 private/
Nun kommen wir zu unseren Clientzertifikaten. Ich werde nachher noch einen Code posten für die automatische erstellung der Zertifikate, jedoch hier einmal in ausführlicher schreibweise:
Der Serverschlüssel erstellen wir als erstes von den Schlüsselpaaren, das geschieht wie folgt:
Code:
touch index.txt && echo "01" > serial
index.txt um später die Zertifikate zu sperren
echo "01" > serial um eine 01 in die serial Datei zu schreiben
zunächst die Zertifikatsanfrage und den Schlüssel erstellen:
Code:
openssl req -new -newkey rsa:2048 -out Zertifikate/server_csr.pem -nodes -keyout private/server_key.pem -days 365
-newkey einen neuen Schlüssel erstellen und
rsa:2048 die Schlüssellänge, hier reicht völlig auch ein 1024
-nodes hier wird kein Passwort auf das Zertifikat gelegt, bei einem Server sehr sinnvoll, damit man beim Starten nicht immer das Passwort eingeben muss, bei den Clients später lassen wir das "-nodes" weg um sicher zu stellen das niemand ungewollt zum Server connecten kann (z.B. wenn der Laptop mit dem Zertifikat geklaut wird)
-keyout auszugebender Schlüssel (Datei)
server_csr.pem ist eine Zertifikatsanfrage
Nun der Schlüssel für den Server und das Signierte Zertifikat:
Code:
openssl x509 -req -in Zertifikate/server_csr.pem -out certs/server_cert.pem -CA vpn-ca.pem -CAkey private/vpn-cakey.pem -CAserial serial -days 365
-in sagt uns welche Zertifikatsanfrage verarbeitet werden soll,
-out so wird unser Zertifikat heißen
-CA unsere CA die das Zertifikat "unterzeichnet"
-CAkey unser "Masterschlüssel" der uns erlaubt dieses Zertifikat zu erstellen.
Die Clients laufen vom Prinzip her gleich ab:
Code:
openssl req -new -newkey rsa:2048 -out Zertifikate/Client1_csr.pem -keyout private/Client1_key.pem -days 365
openssl x509 -req -in Zertifikate/Client1_csr.pem -out Zertifikate/Client1_cert.pem -CA vpn-ca.pem -CAkey private/vpn-cakey.pem -CAserial serial -days 365
Um unseren Zertifikateordner sauber zu halten können wir noch die nun nicht mehr benötigte _csr datei löschen.
Code:
rm Zertifikate/Client1_csr.pem
zu guter letzt erzeugen wir noch einen Diffie Hellman Parameter (Wikipedia: Diffie Hellmann):
Code:
openssl dhparam -out dh2048.pem 2048
Achtung bei 2048 Bit kann es sehr sehr lange dauern, bei mir dauerte dies fast über eine Stunde. 1024 geht dabei wesentlich schneller und reicht für den normalen Gebrauch völlig aus.
Und hier wie Versprochen das Skript um die Zertifikate zu erstellen,einfach in das /etc/ssl/ Verzeichnis kopieren und ausführen...
Code:
./clientzertifikaterstellen Client2
Lesezeichen