PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : OpenVPN Verbindung mit OpenSSL



Grehdl
07.09.06, 13:17
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/


cd /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.


mkdir Zertifikate/

Danach schauen wir uns die openssl.cnf.

Um uns die spätere Arbeit ein wenig zu erleichtern, öffnen wir diese und berabeiten sie.


vi openssl.cnf

Hier stehen am Anfang einige Variablen mit Verzeichnissen, diese sollten wir anpassen, aufgrund späterer Arbeiten.


dir = . # Where everything is kept

hier unser Verzeichnis selbst (mit dem ".") angeben.


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.


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 (http://de.wikipedia.org/wiki/Advanced_Encryption_Standard)),
-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:

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 (http://de.wikipedia.org/wiki/X.509)),
-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:

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:


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:


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:


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:


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.


rm Zertifikate/Client1_csr.pem

zu guter letzt erzeugen wir noch einen Diffie Hellman Parameter (Wikipedia: Diffie Hellmann (http://de.wikipedia.org/wiki/Diffie-Hellman-Schl%C3%BCsselaustausch)):

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...


./clientzertifikaterstellen Client2

Grehdl
07.09.06, 13:18
Endlich sind wir dann nun bei unserem OpenVPN angelangt

Hier müssen wir auf jedem Client OpenVPN installieren (www.openvpn.net). Auf dem Server müssen wir zunächst eine Config erstellen, mit der der Server laufen soll. Ich weiß es klingt vielleich nicht nach einem HowTo die Conig, jedoch ist dort alles Kommentiert.



# Port Standartport 1194
port 12345

# Die Revoke Liste überprüfen
crl-verify /etc/ssl/crl.pem

# TCP oder UDP?
proto udp
mode server
tls-server

dev tun

#Unsere Server IP
ifconfig 10.10.10.1 255.255.255.255

#Server IP Adresse (Adressbereich. in dem Fall alles von 10.10.10.0)
server 10.10.10.0 255.255.255.0

#Wo liegen unsere Zertifikate
ca /etc/ssl/vpn-ca.pem
cert /etc/ssl/Zertifikate/server_cert.pem
key /etc/ssl/private/server_key.pem

#Diffie-Hellmann Parameter
dh /etc/ssl/dh2048.pem

#Die Selbe IP in der nächsten Sitzung vergeben
ifconfig-pool-persist ipp.txt

#IPs in den IP Tables eintragen, DNS neu vergeben und über Den Server das Routing machen, dass man z.B. über den Tunnel auf ein lokaes Intranet zuzugreifen
push "route 10.0.0.0 255.0.0.0"
push "dhcp-option DNS 192.168.1.xyz"
push "redirect-gateway"
push "route 0.0.0.0 0.0.0.0"

#Authentifizierungsmethode
auth SHA1

#Verschlüsselungs Algorithmus
cipher aes-256-cbc

#Benutze Komprimierung
comp-lzo

#Setzt die Rechte
user nobody
group nogroup

#Wird wegen user nobody/group nobody benötigt.
persist-key
persist-tun

#Logging 0, (Zum testen:5)
verb 7



Nun die Client.ovpn (wichtig das auf Windowsclients die Datei mit .ovpn endet um die Datei mit OpenVPN zu assoziieren).



#Festlegen als was fungiert wird
tls-client
pull

# Methode festlegen tun oder tap
dev tun

# Protokoll auswaehlen udp oder tcp
proto udp

# IP/Name und Port des Servers
remote testserver.dyndns.org 12345

# Auflösen des Hostnames des Servers (wegen nicht permanent mit dem Internet verbundenen Rechnern)
resolv-retry infinite

# Lacalen Port festlegen oder freigeben
nobind


# Verbindung immer gleich halten
persist-key
persist-tun

#zu verwendende Zertifikate und Schlüssel
ca vpn-ca.pem
cert ZERTIFIKAT_cert.pem
key SCHLUESSEL_key.pem

# Verschlüsselung
cipher AES-256-CBC

# Komprimiernug
comp-lzo

# Authentifizierungsmethode
auth SHA1

# "Gesprächigkeit" des Tunnels
verb 3

# Silence repeating messages
mute 20



So zum Schluss nur noch die Dateien

vpn-cakey.pem
client.ovpn
client_cert.pem
client_key.pem

sicher (z.B. per USB Stick, WinSCP, oder WinRAR mit Passwort) auf den Client kopieren und loslegen.

Ich hoffe es war hilfreich und hat Euch weitergeholfen.

Hier meine verwendete Quellen:

www.openvpn.net
www.openssl.org
http://www.online-tutorials.net/security/openssl-tutorial/tutorials-t-69-207.html
http://www.online-tutorials.net/security/openvpn-tutorial/tutorials-t-69-209.html
Dank auch an DaGrr linuxforen.de für sein Deutsches OpenVPN HowTo (http://www.linuxforen.de/forums/showthread.php?t=169354) dies hat mir auch den Einstieg erleichtert wenn auch nicht ganz geholfen.
Und an das VPN Forum (http://www.vpnforum.de)