Application VPN mit Stunnel und XCA

XCA & Stunnel 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.

Stunnel Homepage

XCA bei SourceForge

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

XCA

Zunächst muss XCA gestartet werden und eine neue Datenbank angelegt werden.




XCA - New DataBase

Dazu auf Datei und New DataBase klicken.



XCA - New DataBase

Im darauf folgenden Dialog den Namen und Speicherort für die Datenbank angeben.




XCA - New DataBase Passwort

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

XCA - Vorlagen

Auf die Registerkarte Vorlagen wechseln.




XCA - Neues Template

Auf Neues Template klicken und CA auswählen. Die Auswahl mit OK bestätigen.



XCA - Vorlage Besitzer

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

XCA - Vorlage Erweiterungen

Auf den Reiter Erweiterungen wechseln und im Bereich Zeitspanne einen Haken bei Mitternacht setzen und auf OK klicken.





XCA - Neues Template HTTPS_server

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.


XCA - Neues Template HTTPS_client

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.


XCA - Vorlagen

Zum Schluss sollte man insgesamt drei Vorlagen haben. Damit sind die Vorbereitungen abgeschlossen.




CA-Zertifikat Erstellen

XCA - Zertifikate

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.


XCA - Neues Zertifikat

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.



XCA - Neuer Schlüssel

Den darauf folgenden Dialog mit Erstellen bestätigen. Nachdem der Schlüssel erstellt wurde, den Dialog mit OK verlassen.



Server-Zertifikat erstellen

XCA - Neues Zertifikat

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:

XCA - Zertifikate

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.

XCA - Zertifikat Export

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.

Stunnel Ordner

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.

XCA - Rücknahme

Dazu auf den Reiter Zertifikate das entsprechende Zertifikat auswählen und mit der rechten Maustaste darauf klicken. Im Kontextmenü auf Rücknahme klicken.





image

Sobald das Zertifikat ungültig ist, wird es mit einem entsprechenden Symbol gekennzeichnet.


XCA - CRL erstellen

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:

XCA - CA Eigenschaften

XCA -CRL erstellen

XCA - Rücknahmelisten

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

XCA - CRL Rücknahme aufheben

Zurückgenommene Zertifikate kann man jederzeit wieder aktivieren. Dazu das zurückgenommene Zertifikat mit der rechten Maustaste anklicken und auf Rücknahme aufheben klicken.


XCA - Vertrauen

Anschließend erneut das Zertifikat mit der rechten Maustaste anklicken und auf Vertrauen klicken.





XCA - Vertrauen

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

stunnel.exe -install

Stunnel-Dienst

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.

RDP

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

6 Kommentare

  1. Daniel Mueller

    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

  2. andy

    Dann ist vermutlich im Vorfeld schon etwas krumm.

  3. andy

    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.

  4. Daniel Mueller

    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?

  5. andy

    Der Port bzw. Stunnel ist in der Firewall von Windows 7 auch freigeschaltet?

  6. Julius Nyongkaa Nteh

    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?

Schreibe einen Kommentar

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

© 2024 Andy's Blog

Theme von Anders NorénHoch ↑