Das man mit Stunnel aus unsicheren Diensten sichere Dienste machen kann ist weitläufig bekannt. Prominentestes Beispiele ist aus http –> https zu machen. Also relativ einfach eine SSL-Verschlüsselung vor den eigentlich unsicheren Dienst schalten. Mit Stunnel lassen sich aber auch VPNs bauen. Genauer gesagt, ein VPN passend zu einer Applikation oder einen Dienst. Man sollte allerdings abwägen, ob es für die eigenen Zwecke ausreichend ist. Möchte man auf mehrere Ressourcen, z.B. Mail, Dateidienste, … über ein VPN zugreifen, eignen sich die klassischen Lösung wie IPsec, OpenVPN, etc. oder Lösungen wie Microsofts Direct Access besser.
Stunnel an sich ist in der Handhabung sehr einfach. Aufwändiger ist da schon die Zertifikat-Verwaltung, also der Aufbau und Betrieb einer PKI.
Aber was ist eigentlich der Vorteil eines SSL-basierten VPNs? Oftmals ist es so, das diverse Router keinen IPsec-Verkehr durchlassen oder Provider solche Daten nicht zulassen. Letzteres ist oft in Mobilfunk-Netzen der Fall. Optional lässt sich die Freischaltung dann via Tarif erreichen. Bei VPNs auf Basis von SSL hat man, sofern der Port 443 (Standard für SSL/HTTPS) sehr gute Chancen, das einem ein solches Problem nicht begegnet. Ferner sind SSL-VPNs einfacher im Aufbau und Betrieb als das bei z.B. IPsec der Fall ist. Eine gewisse Einarbeitung ist dennoch notwendig. Bei Stunnel im Speziellen ist keine umfangreiche Installation notwendig. Das bietet dem Administrator die Möglichkeit, den SSL-VPN-Client durch einfaches Kopieren zu verteilen oder sogar auf einen USB-Stick immer dabei zu haben.
Für diesen Beitrag verwende ich XCA für die Zertifikat-Verwaltung. XCA ist wie Stunnel für viele Plattformen (Windows, Linux, Mac) verfügbar. Der Beitrag ist zwar für Windows geschrieben, aber Teilweise ebenso für *nix verwendbar.
Hier dient als Beispiel die Absicherung von RDP. Es kann aber genauso gut VNC oder andere Dienste abgesichert werden.
Vorbereitung
Zu allererst benötigt man die aktuellen Versionen von Stunnel und XCA.
Installation vom Server
Stunnel und XCA installieren oder mit 7-Zip entpacken.
Tipp: Der Einfachheit halber habe ich beide Programme unter C:\SSL-VPN\XCA bzw. C:\SSL-VPN\Stunnel installiert. Dadurch umgeht man zusätzlich Probleme mit der Ordner-Virtualisierung von Windows Vista/7.
Aufbau der Zertifikat-Verwaltung (PKI) mit XCA
Zunächst muss XCA gestartet werden und eine neue Datenbank angelegt werden.
Dazu auf Datei und New DataBase klicken.
Im darauf folgenden Dialog den Namen und Speicherort für die Datenbank angeben.
Anschließend muss ein Passwort für die Datenbank vergeben werden.
Sicherheitshinweis: Der Speicherort der Datenbank sollte sicher sein. D.h. durch Berechtigungen und Verschlüsselung den Zugriff einschränken. Das Passwort sollte stark sein, d.h. mit großen und kleinen Buchstaben, Zahlen und Sonderzeichen.
Zertifikat-Vorlagen erstellen
Auf die Registerkarte Vorlagen wechseln.
Auf Neues Template klicken und CA auswählen. Die Auswahl mit OK bestätigen.
Folgende Felder wie folgt ausfüllen:
Interner Name: SSL-VPN CA Vorlage
Länder code: MEIN LAND
Bundesland, Kreis: MEIN BUNDESLAND
Ort: MEINE STADT
Firma: MEINE FIRMA
Firmenabteilung: MEINE ABTEILUNG
Üblicher Name: leer lassen
E-Mail-Adresse: MEINE EMAIL-ADRESSE
Auf den Reiter Erweiterungen wechseln und im Bereich Zeitspanne einen Haken bei Mitternacht setzen und auf OK klicken.
Anschließend müssen die Zertifikat-Vorlagen für den Server und die Clients erstellt werden. Dazu wieder auf Neues Template klicken und für den Server HTTPS_server bzw. HTTPS_client auswählen.
Als interner Name SSL-VPN Server Vorlage bzw. SSL-VPN Client Vorlage angeben. Ggf. sollte man die Laufzeit auf dem Reiter Erweiterungen anpassen. Standardmäßig gilt ein Zertifikat ein Jahr lang.
Zum Schluss sollte man insgesamt drei Vorlagen haben. Damit sind die Vorbereitungen abgeschlossen.
CA-Zertifikat Erstellen
Nun wird zuerst das CA-Zertifikat erstellt. Dieses ist notwendig um die Zertifikate für den Stunnel-Server und die Stunnel-Clients Unterschreiben zu können. Auf die Registerkarte Zertifikate wechseln und Neues Zertifikat anklicken.
Im Bereich Vorlage die SSL-VPN CA Vorlage auswählen und auf Übernehmen klicken. Auf die Registerkarte Besitzer wechseln und bei Interner Name und Üblicher Name einen Namen, z.B. SSL-VPN CA, eingeben. Im Abschnitt Privater Schlüssel auf Erstelle einen neuen Schlüssel klicken.
Den darauf folgenden Dialog mit Erstellen bestätigen. Nachdem der Schlüssel erstellt wurde, den Dialog mit OK verlassen.
Server-Zertifikat erstellen
Auf der Registerkarte Zertifikate auf Neues Zertifikat klicken. Im Bereich Unterschreiben Verwende dieses Zertifikat zum Unterschreiben SSL-VPN CA auswählen. Im Bereich Signatur-algorithmus MD 5 auswählen. Im Bereich Vorlage SSL-VPN Server Vorlage auswählen und auf Übernehmen klicken.
Auf der Registerkarte Besitzer bei Interner Name und Üblicher Name den Namen SSL-VPN Server angeben und im Abschnitt Privater Schlüssel auf Erstelle einen neuen Schlüssel klicken. Nachdem der Schlüssel erstellt wurde, den Dialog mit OK verlassen.
Client-Zertifikat erstellen
Auf der Registerkarte Zertifikate wieder auf Neues Zertifikat klicken. Diesmal die Vorlage SSL-VPN Client Vorlage auswählen und auf Übernehmen klicken. Auf der Registerkarte Besitzer bei Interner Name und Üblicher Name den Namen SSL-VPN Client bzw. den Namen des jeweiligen Benutzers eingeben und im Abschnitt Privater Schlüssel auf Erstelle einen neuen Schlüssel klicken. Nachdem der Schlüssel erstellt wurde, den Dialog mit OK verlassen.
Diesen Abschnitt für alle Clients wiederholen.
Bis zu diesem Zeitpunkt sollte man mindestens drei Zertifikate haben:
Zertifikate exportieren
Damit die Zertifikate für Stunnel nutzbar sind, müssen Diese exportiert werden.
Zuerst wird das CA-Zertifikat exportiert. Dieses Zertifikat benötigt sowohl der SSL-VPN Server als auch die jeweiligen SSL-VPN Clients.
Auf dem Reiter Zertifikate das SSL-VPN CA Zertifikat auswählen und auf Export klicken.
Zuerst den Speicherort und den Namen angeben. Achtung: XCA hängt gerne ein *.crt an!
Als Exportformat PEM auswählen und auf OK klicken.
Am einfachsten ist es, das exportierte CA-Zertifikat zu kopieren und in den Ordner des SSL-VPN Servers und der SSL-VPN Clients einzufügen.
Den Vorgang für das Zertifikat des SSL-VPN Servers und für alle SSL-VPN Clients wiederholen. Den jeweiligen Speicherort und Namen entsprechend anpassen. Als Exportformat PEM Cert + key auswählen.
Im Ordner des SSL-VPN Servers sieht es dann z.B. wie hier aus.
CRL erstellen
Eine CRL, Certificate Revocation List, ist eine Liste von Zertifikaten, die zurückgezogen wurden. Eine CRL ist zu empfehlen, wenn es um mehr als einen SSL-VPN Client geht. Dadurch umgeht man das vollständige neu ausstellen aller Zertifikate, falls ein Client-Zertifikat kompromittiert wird oder ein Benutzer kein SSL-VPN mehr benötigt.
Zunächst aber erst mal die Frage, wie man ein Zertifikat zurück nimmt.
Dazu auf den Reiter Zertifikate das entsprechende Zertifikat auswählen und mit der rechten Maustaste darauf klicken. Im Kontextmenü auf Rücknahme klicken.
Sobald das Zertifikat ungültig ist, wird es mit einem entsprechenden Symbol gekennzeichnet.
Mit einem Rechtsklick auf SSL-VPN CA, CA – CRL erstellen wird die CRL erzeugt.
Die Gültigkeitsdauer der CRL kann sowohl im Dialog beim erstellen der CRL als auch in den Eigenschaften der CA eingestellt werden:
Nun muss die CRL exportiert werden. Dazu auf den Reiter Rücknahmelisten wechseln. Die aktuelle CRL auswählen und auf Export klicken. Anschließend den Speicherort und Namen angeben. Als Exportformat PEM auswählen.
CRL verwalten
Zurückgenommene Zertifikate kann man jederzeit wieder aktivieren. Dazu das zurückgenommene Zertifikat mit der rechten Maustaste anklicken und auf Rücknahme aufheben klicken.
Anschließend erneut das Zertifikat mit der rechten Maustaste anklicken und auf Vertrauen klicken.
Wichtig ist, das man Nur dann vertrauen, wenn wir dem Aussteller vertrauen auswählt.
Sobald die Rücknahme abgeschlossen ist, muss eine neue CRL erzeugt und exportiert werden.
Konfiguration des Stunnel-Server
Zunächst wird der Stunnel-Server vorbereitet.
Eine Datei stunnel.conf im Ordner des Stunnel-Servers mit einem Text-Editor anlegen und folgenden Inhalt einfügen:
; Certificate + key
cert = SSL-VPN_Server.pem
; Some performance tunings
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
; Authentication stuff
verify = 2
; CAfile
CAfile = SSL-VPN_CA_Cert.pem
; CRLfile
;CRLfile = SSL-VPN_CA_CRL.pem <- wird benötigt wenn eine CRL verwendet wird
; Some debugging stuff useful for troubleshooting
;debug = 7
output = stunnel.log
; Service-level configuration
[SERVICENAME]
accept = IP:PORT
connect = IP:PORT
TIMEOUTclose = 0
Den Bereich [SERVICENAME] auf die entsprechenden Bedürfnisse anpassen. Wenn auf allen IP-Adressen des Servers Verbindungen angenommen werden sollen, reicht es aus, nur den Port bei accept anzugeben. Falls das Ziel ebenfalls der Server ist, gilt das Gleiche wie beim Akzeptieren von Verbindungen, nur unter connect. Benötigt man mehr als einen Port, so kann man mehrere Serviceabschnitte definieren.
Um Stunnel unter Windows als Dienst zu installieren folgenden Befehl ausführen:
stunnel.exe -install
Um Stunnel zu starten entweder den Befehl stunnel.exe –start ausführen oder in der Dienste-Verwaltung stunnel starten.
Konfiguration des Stunnel-Clients
Eine Datei stunnel.conf im Ordner des Stunnel-Clients mit einem Text-Editor anlegen und folgenden Inhalt einfügen:
; Certificate + key
cert = SSL-VPN_Client.pem
; Some performance tunings
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
; Authentication stuff
verify = 2
; CAfile
CAfile = SSL-VPN_CA_Cert.pem
; Some debugging stuff useful for troubleshooting
;debug = 7
output = stunnel.log
; Use it for client mode
client = yes
; Service-level configuration
[SERVICENAME]
accept =PORT
connect = IP:PORT
TIMEOUTclose = 0
Im Bereich [SERVICENAME] – accept den lokalen Port angeben, auf den Verbindungen angenommen werden sollen. Bei connect die IP-Adresse oder den Computernamen und den Port des Stunnel-Servers angeben.
Den Stunnel-Client kann man genauso wie den Stunnel-Server als Dienst laufen lassen. Das bietet den Vorteil, dass das Programm transparent im Hintergrund läuft und vom Benutzer keinen Eingriff verlangt. Alternativ lässt sich der Stunnel-Client wie eine Anwendung ausführen.
Sobald der Stunnel-Client ausgeführt wird, kann z.B. über den Remote Desktop Client unter Angabe der localhost-Adresse und des Ports eine mit SSL-verschlüsselte Verbindung hergestellt werden.
Hier ein kleines Beispiel-Skript für den Start von Stunnel, dem Aufruf des Remote Desktop Clients und dem anschließenden beenden von Stunnel:
@echo off
title ssl-vpn client
rem start stunnel
start stunnel.exe
rem start rdp
mstsc /v:localhost:9000
rem kill stunnel
taskkill /im stunnel.exe /f /t
Tipp: Falls man kein Tray Icon haben möchte, dann in der stunnel.conf folgende Zeile einfügen:
; Taskbar icon
taskbar = no
Ein paar abschließende Worte
Für ein automatisches Verteilen bietet sich zudem die Option -quiet an. Dadurch wird der Stunnel-Dienst ohne Meldung installiert.
Nicht vergessen darf man die Konfiguration der Firewall für alle verwendeten Ports.
Unter Umständen macht es bei schmalbandigen Verbindungen Sinn,
die Option compression = zlib | rle in der stunnel.conf zu setzen. Dadurch wird eine Kompression aktiviert. In manchen Szenarien kann dies aber auch negative Auswirkungen haben, so z..B. bei Fernzugriffen wie RDP, da hier unter Umständen eine spürbare Latenz verursacht wird
Links
OpenVPN.eu Wiki – Schlüsselverwaltung mit XCA
Optik Berndt – Erstellen von Zertifikaten mit xca speziell zur Nutzung mit OpenVPN
Verheiratet, Vater von zwei Kindern, eines an der Hand, eines im Herzen. Schon immer Technik-Freund, seit 2001 in der IT tätig und seit über 10 Jahren begeisterter Blogger. Mit meiner Firma IT-Service Weber kümmern wir uns um alle IT-Belange von gewerblichen Kunden und unterstützen zusätzlich sowohl Partner als auch Kollegen.
Server Zertifikat erstellen funktioniert bei mir so nicht.
” Im Bereich Unterschreiben Verwende dieses Zertifikat zum Unterschreiben SSL-VPN CA ” ist bei mir ausgegraut? SSL-VPN CA
steht auch nicht drin?!
Eine Idee?
Grüße
Daniel
Dann ist vermutlich im Vorfeld schon etwas krumm.
Ich hab’s grad mal durchgeklickert, zumindest den XCA-Teil bis zum Export der Zertifikate. Hat bei mir funktioniert. Mir ist nur aufgefallen, das (mal wieder) das eine oder andere Feld anders benannt worden ist und ein paar Schaltflächen sich geändert haben, alles aber halb so wild.
Habe es jetz hinbekommen. Wenn man das CA erstellt muß man natürlich auch auswälen das es die “Authorität” ist.
Habe aber noch ein anderes Problem unter Windows 7 und RDP.
Server und Client beide Windows 7.
Meine stunnel.conf-SERVER:
debug = 7
output = stunnel.log
; Disable FIPS mode to allow non-approved protocols and algorithms
;fips = no
cert = SSL-VPN_Server.pem
; Authentication stuff needs to be configured to prevent MITM attacks
; It is not enabled by default!
verify = 2
; Don’t forget to c_rehash CApath
;CApath = certs
; It’s often easier to use CAfile
CAfile = SSL-VPN_CA.pem
; Don’t forget to c_rehash CRLpath
;CRLpath = crls
; Alternatively CRLfile can be used
;CRLfile = crls.pem
; **************************************************************************
; * Service definitions (at least one service has to be defined) *
; **************************************************************************
; Some performance tunings
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
; Example SSL server mode services
[rdesktop]
accept = 9100
connect = 3389
TIMEOUTClose=0
#########################################################
Meine stunnel.conf CLIENT:
; Debugging stuff (may useful for troubleshooting)
debug = 7
output = stunnel.log
; Disable FIPS mode to allow non-approved protocols and algorithms
;fips = no
; **************************************************************************
; * Service defaults may also be specified in individual service sections *
; **************************************************************************
; Certificate/key is needed in server mode and optional in client mode
cert = SSL-VPN_Client1.pem
; Authentication stuff needs to be configured to prevent MITM attacks
; It is not enabled by default!
verify = 2
; Don’t forget to c_rehash CApath
;CApath = certs
; It’s often easier to use CAfile
CAfile =SSL-VPN_CA.pem
; Don’t forget to c_rehash CRLpath
;CRLpath = crls
; Alternatively CRLfile can be used
;CRLfile = crls.pem
; Some performance tunings
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
;Client definieren
client=yes
; **************************************************************************
; * Service definitions (at least one service has to be defined) *
; **************************************************************************
; Example SSL server mode services
[rdesktop]
accept = 1234
connect =Meine.Server.IP:9100
TIMEOUTClose=0
Leider gibt mir der Client wenn ich mich mit RDP verbinde:
start C:\VPN-SSL\stunnel\stunnel.exe
rem start rdp
mstsc /v:localhost:1234
Immer folgendes aus und ich bekomme keine Verbindung. Die Verbindung läuft über einen Router der externe Port ist auf den Port von
Stunnel-Server umgeleitet:
2012.08.13 10:00:16 LOG7[2440:4172]: Private key loaded
2012.08.13 10:00:16 LOG7[2440:4172]: Loaded verify certificates from SSL-VPN_CA.pem
2012.08.13 10:00:16 LOG7[2440:4172]: Loaded SSL-VPN_CA.pem revocation lookup file
2012.08.13 10:00:16 LOG7[2440:4172]: SSL options set: 0x00000004
2012.08.13 10:00:16 LOG5[2440:4172]: Configuration successful
2012.08.13 10:00:16 LOG7[2440:4172]: Service [rdesktop] (FD=216) bound to 0.0.0.0:1234
2012.08.13 10:00:17 LOG7[2440:4172]: Service [rdesktop] accepted (FD=408) from 127.0.0.1:50715
2012.08.13 10:00:17 LOG7[2440:4172]: Creating a new thread
2012.08.13 10:00:17 LOG7[2440:4172]: New thread created
2012.08.13 10:00:17 LOG7[2440:2936]: Service [rdesktop] started
2012.08.13 10:00:17 LOG5[2440:2936]: Service [rdesktop] accepted connection from 127.0.0.1:50715
2012.08.13 10:00:17 LOG6[2440:2936]: connect_blocking: connecting 217.92.56.220:9100
2012.08.13 10:00:17 LOG7[2440:2936]: connect_blocking: s_poll_wait 217.92.56.220:9100: waiting 10 seconds
2012.08.13 10:00:27 LOG3[2440:2936]: connect_blocking: s_poll_wait 217.92.56.220:9100: TIMEOUTconnect exceeded
2012.08.13 10:00:27 LOG5[2440:2936]: Connection reset: 0 byte(s) sent to SSL, 0 byte(s) sent to socket
2012.08.13 10:00:27 LOG7[2440:2936]: Local socket (FD=408) closed
2012.08.13 10:00:27 LOG7[2440:2936]: Service [rdesktop] finished (0 left)
2012.08.13 10:00:32 LOG7[2440:4172]: Dispatching signals from the signal pipe
2012.08.13 10:00:32 LOG7[2440:4172]: Processing SIGNAL_REOPEN_LOG
2012.08.13 10:00:32 LOG5[2440:4172]: Log file reopened
2012.08.13 10:00:32 LOG7[2440:4172]: Signal pipe is empty
Habt ihr eine Idee wieso?
Der Port bzw. Stunnel ist in der Firewall von Windows 7 auch freigeschaltet?
Hallo Andy
Vielen Dank für Ihre tollen Artikel, ich habe ein Problem mit xca Client Zertifikat. Wenn ich ein neues Client-Zertifikat erstelle, funktioniert es nicht, aber alt einmal funktionieren, was kann das Problem sein, können Sie mir über anydesk helfen?