Zertifikatserstellung
Unter Linux gibt es viele Möglichkeiten Zertifikate zu erstellen.
Ich stelle hier in diesem Howto die manelle und easy-rsa script Möglichkeit vor. Unter Windows ist es ebenfalls möglich Zertifikate zu erstellen und ich möchte dies ebenfalls aufzeigen, wie dies unter Windows funktioniert anhand der easy-rsa Scripte.
Im Anschluß der Zertifikatserstellung folgen Beispiele für die Konfiguration.
Zertifikatserstellung mit easy-rsa
Wir erstellen Zertifikate mit den easy-rsa Scripten aus dem OpenVPN-Paket. Ich werde hier die Vorgehensweise für Linux und Windows darstellen. Die Beschreibung lehnt sich stark an die Original-Dokumentation von OpenVPN an und kann als Übersetzung ins Deutsche verstanden werden, mit Kommentaren und Erweiterungen von mir.
Als erstes kopieren wir das easy-rsa Verzeichnis in unser /etc/openvpn Verzeichnis, was zur besseren Übersicht dient. Wir wechseln danach in das Verzeichnis /etc/openvpn/easy-rsa.
Unter Windows wechseln wir in der Command-Shell (cmd.exe) das Verzeichnis nach c:\Programme\OpenVPN\easy-rsa.
Anmerkung für Windows:
Wir führen init-config.bat aus, dabei werden existierende vars.bat und openssl.cnf Dateien überschrieben.
Anmerkung für Linux:
Eventuell muß die enthaltene OpenSSL Konfigurationsdatei opennssl.cnf entpackt werden, da sonst die Datei nicht gefunden wird.
Nun editieren wir die vars.bat (Windows) / vars (Linux) und setzen die Variablen für die Zertifikatserstellung. Die Angaben hinter dem „=“ Zeichen können anders lauten, es muß nicht z.B. =Berlin heißen. Es kann auch eine andere Stadt eingetragen werden, je nach Bedarf. Das gilt ebenfalls für die anderen Variablen.
KEY_COUNTRY=DE
KEY_PROVINCE=Bezirk
KEY_CITY=Berlin
KEY_ORG=IT-Abteilung
KEY_MAIL=holgi@domain.de
Dabei sollte keine dieser Variablen leer bleiben.
Wer Paranoid ist, kann auch den Wert „KEY_SIZE=1024“ höher setzen, z.B. auf 2048 oder 4096.
Wir erstellen nun in dem kommenden Abschnitt die Zertifikate und Schlüssel für die Root-CA, den Server und den oder die Clients.
Wir führen nun folgende Befehle aus:
Code:
Linux
. ./vars
./clean-all
./build-ca
Code:
Windows
vars.bat
clean-all.bat
build-ca.bat
Nach dem ausführen von build-ca (Linux) oder build-ca.bat (Windows) beginnt die Erstellung des/der Certificate Authority (CA) Zertifikats und des dazu gehörigen Schlüssels.
Nun kann man entsprechende Werte setzen aber da wir die Variablen bereits in der Datei vars (Linux) / vars.bat (Windows) gesetzt haben, brauchen wir nur noch mit der Return-Taste bestätigen.
Achtung: Der einzige Wert den wir explizit setzen müssen ist der „Common Name“. Der Common Name muß einzigartig sein und darf in keinem anderen Zertifikat vorkommen.
Ich habe für das Root-CA Zertifikat „OpenVPN-CA“ gewählt.
Erstellung des Zertifikats und des Schlüssels für den OpenVPN Server
Code:
Linux
./build-key-server server
Code:
Windows
build-key-server.bat server
Wie zuvor können wir die Parameter aus der Datei vars (Linux) / vars.bat (Windows) übernehmen und mit der Return-Taste übernehmen.
Achtung: Auch hier muß ein „Common Name“ per Hand eingetragen werden und wie schon gesagt muß der Name einzigartig sein.
Ich habe als Common Name „Vpn-Server“ gewählt.
Nach Ausführung müssen wir noch 2x mit [y] (Ja) bestätigen.
Erstellung der Zertifikate und Schlüssel für den/die Clients
Code:
Linux
./build-key client1
Code:
Windows
build-key.bat client1
Soll der Client Key Passwort geschützt werden, dann nehmen wir hier eine andere Datei und zwar:
Code:
Linux
./build-key-pass client1
Code:
Windows
build-key-pass.bat client1
Denk daran, dass der „Common Name“ für jedes Zertifikat anders lauten muß.
Ich habe als Common Name „client1“ ausgewählt. Für weitere Clients könnte man das fortführen und als Common Name client2, client3 usw. nutzen.
Wieder bestätigen wir 2x mit [y] (Ja).
Generieren des Diffie Hellman Parameters
Der Diffie Hellman Parameter wird für den OpenVPN Server erstellt und verbleibt auf diesem.
WindowsLinux
build-dh.bat ./build-dh
Die Erstellung von DH kann eine weile dauern. Die Geschwindigkeit ist abhängig von der CPU-Leistung und der gewählten Bitlänge. Je höher die Bitlänge, um so länger dauert die Erstellung.
Zugehörigkeit unser neu erstellten Zertifikate und Schlüssel
http://www.linux-technik.de/downloads/links/zert.png
Der nächste Schritt ist, die erstellten Schlüssel und Zertifikate an den entsprechenden Ort zu kopieren. Auf entfernte PCs sollte man fürs kopieren eine sichere Übertragungsart wählen. Entweder manuell z.B. per Usb-Stick (falls möglich) oder per SSH.
Manuelle Erstellung der Zertifikate unter Linux
Anmerkung: Ich habe in der Konfigurationsdatei für OpenSSL einige Pfadangaben geändert. Im Anhang füge ich die bearbeitete openssl.cnf bei.
Es sollte zur Vermeidung von eventuellen Problemen meine openssl.cnf verwendet werden.
Wir erstellen erstmal ein Arbeitsverzeichnis indem wir alle weiteren Schritte durchführen werden.
Code:
mkdir /etc/openvpn/zertifikate
wechseln in das Arbeitsverzeichnis
Code:
cd /etc/openvpn/zertifikate
Nun kopieren wir die openssl.cnf (OpenSSL Konfigurationsdatei), die ich als Download angehängt habe und die Datei CA.pl womit wir eine CA Zertifizierungstelle erstellen werden, in unser Arbeitsverzeichnis.
Die Datei CA.pl befindet sich bei Debian unter
/usr/lib/ssl/misc/CA.pl.
Code:
cp /usr/lib/ssl/misc/CA.pl /etc/openvpn/zertifikate
Sollte die CA.pl an einem anderen Ort liegen, können wir mit den beiden folgenden Befehlen den Ort ausfindig machen und sie dann in unser Arbeitsverzeichnis kopieren.
(vorher updatedb als root ausführen)
oder
(normalerweise in /usr zu finden)
Nun erstellen wir die Datei “serial“
und fügen folgenden Inhalt ein:
(Entertaste drücken!) und dann abspeichern.
Als letztes erstellen wir uns eine index.txt die leer bleibt.
Damit nun openssl weiß welche openssl.cnf wir jetzt verwenden werden, führen wir folgenden Shell Befehl aus:
Code:
export OPENSSL_CONF=/etc/openvpn/zertifikate/openssl.cnf
Mit dem Befehl "env" können wir das überprüfen ob der Wert gesetzt wurde.
Bevor wir nun anfangen, können wir noch die openssl.cnf nach unseren wünschen verändern zb können wir den Standard Wert von 1024Bit auf 2048Bit setzen. Für ganz Paranoide ist wohl auch 4096Bit möglich, was ich aber nicht getestet habe.
Ist die openssl.cnf editiert (kein muss) können wir uns nun an die Erstellung der Zertifikate wenden:
Erstellung der CA:
Ist das erledigt (Passwort gut merken), gehts weiter...
Master Zertifikat:
Code:
openssl req -days 3650 -nodes -new -x509 -keyout ca.key -out ca.crt
Diffie Hellman Parameter für den Server erstellen:
Code:
openssl dhparam -out dh2048.pem 2048
(kann sehr lange dauern!)
Zertifikat für Server:
Code:
openssl req -days 3650 -nodes -new -keyout server.key -out server.csr
openssl ca -days 3650 -out server.crt -in server.csr
Zertifikat für den Client:
Code:
openssl req -days 3650 -nodes -new -keyout client1.key -out client1.csr
openssl ca -days 3650 -out client1.crt -in client1.csr
Anmerkung:
Der Common Name muss immer verschieden sein, ansonsten gibt es ein Database Error!
Immer alle *.old files löschen nach dem erstellen von Zertifikaten.
Nun können wir die Dateien client1.crt, client1.key und ca.crt über einen sicheren Weg z.B. SSH auf den Clienten übertragen. Die Zertifikate für den Server kommen auf dem OpenVPN Server.
Beispiel Konfigurationen
Routing:
Wenn geroutet werden soll, was bei Verwendung des TUN-Adapters ja notwendig ist, dann muß Routing bei dem Linux Rechnern aktiviert werden. Bei Verwendung von iptables-Paketfilter muß entsprechend eine weitere Regel hinzugefügt werden.
Das Routing aktivieren:
Code:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables Regel:
Code:
iptables -A FORWARD -i tun+ -j ACCEPT
Ausgangslage für Beispiel 1) und 2)
OpenVPN Server: Netzwerk Home: 192.168.1.1/24, VPN Adresse: 10.1.0.1
OpenVPN Client: Netzwerk Home; 192.168.1.1/24, VPN Adresse; 10.1.0.2
1) Einfacher OpenVPN Tunnel mit Zertifikaten, 1 Server, 1 Client (Linux)
Server:
Code:
dev tun
proto udp
port 1194
ifconfig 10.1.0.1 10.1.0.2
tls-server
dh /etc/openvpn/zertifikate/dh2048.pem
ca /etc/openvpn/zertifikate/ca.crt
cert /etc/openvpn/zertifikate/server.crt
key /etc/openvpn/zertifikate/server.key
user nobody
group nogroup
status /etc/openvpn/openvpn-status.log
comp-lzo
verb 3
Client:
Code:
dev tun
remote 192.168.1.1
ifconfig 10.1.0.2 10.1.0.1
tls-client
ca /etc/openvpn/zertifikate/ca.crt
cert /etc/openvpn/zertifikate/client1.crt
key /etc/openvpn/zertifikate/client1.key
port 1194
user nobody
group nogroup
comp-lzo
verb 3
2) OpenVPN Tunnel mit Zertifikaten, Routing, 1 Server, x Client's (Linux)
In der ersten Beispielkonfiguration konnte nur ein Client mit dem VPN Server eine Verbindung aufbauen. Des Weiteren war kein Zugriff auf hinter dem OpenVPN Server liegendem Netzwerk möglich, da keine Routing Optionen gesetzt wurden.
In der folgenden Konfiguration wird der OpenVPN Server als DHCP Server dienen, sprich den Clienten eine IP Adresse zuweisen. Damit das funktioniert, muß das Routing stimmen. Außerdem ersetzen wir den Verschlüsselungsalgorithmus „Blowfish“ durch AES mit 256Bit.
Server:
Code:
dev tun
proto udp
port 1194
server 192.168.1.0 255.255.255.0
mode server
ifconfig-pool-persist /etc/openvpn/ipp.txt
tls-server
dh /etc/openvpn/zertifikate/dh2048.pem
ca /etc/openvpn/zertifikate/ca.crt
cert /etc/openvpn/zertifikate/server.crt
key /etc/openvpn/zertifikate/server.key
push „route 192.168.1.0 255.255.255.0“
cipher AES-256-CBC
user nobody # Nur Linux
group nogroup # Nur Linux
status /etc/openvpn/openvpn-status.log
comp-lzo
verb 3
Client:
Für weitere Clients, brauchen wir natürlich weitere Client Zertifikate, die wir vorher erstellt haben.
Code:
dev tun
remote 192.168.1.1
tls-client
ca /etc/openvpn/zertifikate/ca.crt
cert /etc/openvpn/zertifikate/client1.crt
key /etc/openvpn/zertifikate/client1.key
pull
port 1194
cipher AES-256-CBC
user nobody # Nur Linux
group nogroup # Nur Linux
comp-lzo
verb 3
3) OpenVPN Tunnel mit Zertifikaten, Site-to-Site, 2 Server (Linux)
Ausgangslage für Beispiel 3)
OpenVPN Server1: Netzwerk Home: 192.168.1.1/24, VPN Adresse: 10.1.0.1, DnyDNS Name: berlin.dyndns.org
OpenVPN Server2: Netzwerk Home; 192.168.3.1/24, VPN Adresse; 10.1.0.2
In diesem Konfigurations Beispiel soll eine Site-to-Site dargestellt werden.
Es werden sozusagen 2 Firmenstandorte miteinander verbunden.
Das heißt, es gibt keine Clients in dem Sinne wie in den anderen Beispielen, wo z.B. ein Roadwarrior, also von unterwegs per Notebook auf das Netzwerk zugegriffen werden soll.
Es soll aber jeder Client das andere Netzwerk erreichen können. Damit das klappt, muß das Routing auf beiden Seiten modifiziert werden. Des Weiteren muß einer der OpenVPN Server als Server konfiguriert und der andere als Client konfiguriert werden.
Server:
Code:
dev tun
proto udp
port 1194
ifconfig 10.1.0.1 10.1.0.2
tls-server
dh /etc/openvpn/zertifikate/dh2048.pem
ca /etc/openvpn/zertifikate/ca.crt
cert /etc/openvpn/zertifikate/server.crt
key /etc/openvpn/zertifikate/server.key
up ./server1.up
cipher AES-256-CBC
user nobody # Nur Linux
group nogroup # Nur Linux
status /etc/openvpn/openvpn-status.log
comp-lzo
verb 5
up-Script für Server 1:
Code:
touch server1.up && chmod +x server1.up
mit folgenden Inhalt:
Code:
#!/bin/bash
route add -net 192.168.3.0 netmask 255.255.255.0 gw 10.1.0.2
Unter Windows würde eine Angabe so aussehen:
Code:
route add 192.168.3.0 mask 255.255.255.0 10.1.0.2 metric 1 -p
„-p“ sorgt dafür, dass die gesetzte Route permanent gesetzt wird.
Server 2:
Code:
dev tun
remote berlin.dyndns.org
ifconfig 10.1.0.2 10.1.0.1
tls-client
ca /etc/openvpn/zertifikate/ca.crt
cert /etc/openvpn/zertifikate/server2.crt
key /etc/openvpn/zertifikate/server2.key
up ./tunnel.up
port 1194
cipher AES-256-CBC
user nobody # Nur Linux
group nogroup # Nur Linux
comp-lzo
verb 5
up-Script für Server 2:
Code:
touch server2.up && chmod +x server2.up
mit folgenden Inhalt:
Code:
#!/bin/bash
route add -net 192.168.1.0 netmask 255.255.255.0 gw 10.1.0.1
Unter Windows würde eine Angabe so aussehen:
Code:
route add 192.168.1.0 mask 255.255.255.0 10.1.0.1 metric 1 -p
„-p“ sorgt dafür, dass die gesetzte Route permanent gesetzt wird.
Lesezeichen