Dieses Tutorial zeigt Ihnen, wie Sie die Zertifikatsauthentifizierung im OpenConnect VPN-Server (ocserv) einrichten auf Debian/Ubuntu/CentOS/RHEL. OpenConnect (ocserv) ist eine Open-Source-Implementierung des Cisco AnyConnect VPN-Protokolls.
In einem früheren Artikel habe ich die Schritte zum Einrichten des OpenConnect VPN-Servers mit Let’s Encrypt TLS-Serverzertifikat erklärt. Let’s Encrypt stellt kein Client-Zertifikat aus, daher haben wir in diesem Artikel eine Passwortauthentifizierung verwendet. Die ständige Eingabe von Benutzername und Passwort kann mühsam sein, insbesondere wenn die Client-Software, wie z. B. die Cisco AnyConnect-App auf iOS, keine Option zum Merken von Passwörtern bietet. Viele OpenConnect-Client-Software können Benutzerzertifikate importieren, die den Benutzer von der Eingabe von Benutzername und Passwort befreien. Die Zertifikatsauthentifizierung ist außerdem sicherer als die Passwortauthentifizierung.
Anforderungen
Um diesem Tutorial zu folgen, wird davon ausgegangen, dass Sie bereits einen OpenConnect VPN-Server mit Let’s Encrypt TLS-Serverzertifikat eingerichtet haben. Wenn nicht, folgen Sie bitte einem der folgenden Tutorials.
- OpenConnect VPN Server (ocserv) auf Ubuntu 20.04 mit Let’s Encrypt einrichten
- OpenConnect VPN Server (ocserv) auf Debian 11 Bullseye mit Let’s Encrypt einrichten
- OpenConnect VPN Server (ocserv) auf CentOS 8/RHEL 8 mit Let’s Encrypt einrichten
Wir richten unsere eigene CA (Certificate Authority) ein, um das Client-Zertifikat zu signieren. Der ocserv
Daemon sollte weiterhin das von Let’s Encrypt ausgestellte TLS-Serverzertifikat verwenden, damit die Client-Software keine Sicherheitswarnung anzeigt.
Einrichten Ihrer eigenen CA (Certificate Authority)
Wir möchten die Zertifikatsauthentifizierung verwenden, aber Let’s Encrypt stellt kein Client-Zertifikat aus, also müssen wir unsere eigene Zertifizierungsstelle erstellen. Sie können openssl
verwenden um die Arbeit zu erledigen, aber ocserv empfiehlt GnuTLS, also werde ich Ihnen zeigen, wie man GnuTLS verwendet.
Installieren Sie gnutls-bin
Paket auf dem Debian/Ubuntu-Server.
sudo apt install gnutls-bin
Installieren Sie gnutls-utils
Paket auf CentOS/RHEL.
sudo dnf install gnutls-utils
Erstellen Sie ein Unterverzeichnis in /etc/ocserv/
um private Schlüssel und Zertifikate zu halten.
sudo mkdir /etc/ocserv/ssl/
Ändern Sie Ihr Arbeitsverzeichnis.
cd /etc/ocserv/ssl/
Generieren Sie mit dem certtool
einen privaten Schlüssel für die CA Befehl, der von gnutls-bin
bereitgestellt wird oder gnutls-utils
Paket. Standardmäßig wird ein 3072-Bit-RSA-Schlüssel generiert, was ausreichend ist.
sudo certtool --generate-privkey --outfile ca-privkey.pem
Lassen Sie uns vor dem Generieren des CA-Zertifikats die Vorlagendatei für das CA-Zertifikat erstellen. Das Vorlagendateiformat finden Sie im certtool-Handbuch (man certtool
).
sudo nano ca-cert.cfg
Fügen Sie der Datei die folgenden Zeilen hinzu. Ersetzen Sie Platzhalter durch die entsprechenden Werte.
# X.509 Certificate options # The organization of the subject. organization = "vpn.example.com" # The common name of the certificate owner. cn = "Example CA" # The serial number of the certificate. serial = 001 # In how many days, counting from today, this certificate will expire. Use -1 if there is no expiration date. expiration_days = -1 # Whether this is a CA certificate or not ca # Whether this certificate will be used to sign data signing_key # Whether this key will be used to sign other certificates. cert_signing_key # Whether this key will be used to sign CRLs. crl_signing_keyverwendet
Speichern und schließen Sie die Datei. Generieren Sie nun das CA-Zertifikat mit Konfigurationen aus der Vorlagendatei.
sudo certtool --generate-self-signed --load-privkey ca-privkey.pem --template ca-cert.cfg --outfile ca-cert.pem
Jetzt haben wir eine CA-Zertifikatsdatei (ca-cert.pem
).
Client-Zertifikat wird generiert
Führen Sie nun den folgenden Befehl aus, um den privaten Schlüssel des Clients zu generieren.
sudo certtool --generate-privkey --outfile client-privkey.pem
Erstellen Sie die Vorlagendatei für das Client-Zertifikat.
sudo nano client-cert.cfg
Fügen Sie die folgenden Zeilen in die Datei ein. Die uid muss ein Benutzername in /etc/ocserv/ocpasswd
sein Datei.
# X.509 Certificate options # The organization of the subject. organization = "vpn.example.com" # The common name of the certificate owner. cn = "John Doe" # A user id of the certificate owner. uid = "username" # In how many days, counting from today, this certificate will expire. Use -1 if there is no expiration date. expiration_days = 3650 # Whether this certificate will be used for a TLS server tls_www_client # Whether this certificate will be used to sign data signing_key # Whether this certificate will be used to encrypt data (needed # in TLS RSA ciphersuites). Note that it is preferred to use different # keys for encryption and signing. encryption_key
Speichern und schließen Sie die Datei. Führen Sie dann den folgenden Befehl aus, um ein Client-Zertifikat zu generieren, das mit dem privaten CA-Schlüssel signiert wird.
sudo certtool --generate-certificate --load-privkey client-privkey.pem --load-ca-certificate ca-cert.pem --load-ca-privkey ca-privkey.pem --template client-cert.cfg --outfile client-cert.pem
Kombinieren Sie den privaten Schlüssel und das Zertifikat des Clients in einer PKCS #12-Datei, die durch eine PIN geschützt ist.
sudo certtool --to-p12 --load-privkey client-privkey.pem --load-certificate client-cert.pem --pkcs-cipher aes-256 --outfile client.p12 --outder
Jetzt haben wir den privaten Schlüssel und das Zertifikat des Clients in einer Datei zusammengefasst client.p12
.
Beachten Sie, dass die Ciso AnyConnect-App auf iOS keine AES-256-Verschlüsselung unterstützt. Es weigert sich, das Client-Zertifikat zu importieren. Wenn der Benutzer ein iOS-Gerät verwendet, können Sie 3des-pkcs12
auswählen Chiffre.
sudo certtool --to-p12 --load-privkey client-privkey.pem --load-certificate client-cert.pem --pkcs-cipher 3des-pkcs12 --outfile ios-client.p12 --outder
Der private Schlüssel und das Zertifikat des Clients kombiniert in einer Datei ios-client.p12
.
Zertifikatsignierungsanforderung
Dieser Schritt ist nur erforderlich, wenn es mehrere VPN-Benutzer gibt und der Benutzer seinen eigenen privaten Schlüssel verwenden möchte.
Um die privaten Schlüssel der Endbenutzer geheim zu halten, können Benutzer Zertifikatsignierungsanforderungen (CSR) mit ihren eigenen privaten Schlüsseln generieren und dann Zertifikatanforderungen an den Administrator senden, der dann Client-Zertifikate für Benutzer ausstellt. Zuerst müssen sie mit den oben genannten Befehlen den privaten Schlüssel und die Client-Zertifikatsvorlage generieren. Generieren Sie dann mit dem folgenden Befehl eine CSR. Die request.pem
Datei ist mit dem privaten Schlüssel des Benutzers signiert.
certtool --generate-request --load-privkey client-privkey.pem --template client-cert.cfg --outfile request.pem
Als nächstes sendet der Benutzer die request.pem
und client-cert.cfg
Datei an den Administrator, der den folgenden Befehl ausführt, um das Client-Zertifikat zu generieren.
sudo certtool --generate-certificate --load-ca-certificate ca-cert.pem --load-ca-privkey ca-privkey.pem --load-request request.pem --template client-cert.cfg --outfile client-cert.pem
Danach sendet der Administrator client-cert.pem
Zertifikatsdatei an den Benutzer.
Aktivieren der Zertifikatsauthentifizierung im ocserv-Daemon
ocserv-Konfigurationsdatei bearbeiten.
sudo nano /etc/ocserv/ocserv.conf
Im vorherigen Tutorial haben wir die folgende Zeile hinzugefügt, um die Passwortauthentifizierung zu aktivieren.
auth = "plain[passwd=/etc/ocserv/ocpasswd]"
Kommentieren Sie die folgende Zeile aus, um die Zertifikatsauthentifizierung zu aktivieren.
auth = "certificate"
Wenn die beiden obigen Zeilen beide unkommentiert sind, bedeutet dies, dass der Benutzer sowohl die Kennwortauthentifizierung als auch die Zertifikatsauthentifizierung bestehen muss. Wenn also die Zertifikatsauthentifizierung ausreicht, um die Identität nachzuweisen, kommentieren Sie die erste Zeile aus.
Wenn Sie Benutzern erlauben, entweder die Zertifikatsauthentifizierung oder die Passwortauthentifizierung zu wählen, sollten Sie stattdessen die folgenden Zeilen haben.
enable-auth = "plain[passwd=/etc/ocserv/ocpasswd]" auth = "certificate"
Suchen Sie nun den ca-cert-Parameter. Unter Debian/Ubuntu ist es auf
eingestelltca-cert = /etc/ssl/certs/ssl-cert-snakeoil.pem
Unter CentOS 8/RHEL 8 ist es auf
eingestelltca-cert = /etc/ocserv/ca.pem
Wir müssen unser eigenes CA-Zertifikat verwenden, um das Client-Zertifikat zu verifizieren, also ändern Sie diese Zeile in
ca-cert = /etc/ocserv/ssl/ca-cert.pem
Suchen Sie als Nächstes die folgende Zeile.
cert-user-oid = 0.9.2342.19200300.100.1.1
Sie müssen es nicht ändern. Ich möchte Ihnen nur sagen, dass 0.9.2342.19200300.100.1.1
steht für die im Client-Zertifikat hinterlegte UID. Die obige Zeile teilt ocserv
mit Daemon, um den Benutzernamen aus dem UID-Feld des Client-Zertifikats zu finden. Wenn das Client-Zertifikat erfolgreich durch das CA-Zertifikat und ocserv
verifiziert wurde Daemon kann einen passenden Benutzernamen in /etc/ocserv/ocpasswd
finden Datei, dann kann sich der Client anmelden.
Speichern und schließen Sie die Datei. Starten Sie dann ocserv neu.
sudo systemctl restart ocserv
Verwenden der Zertifikatsauthentifizierung auf Debian/Ubuntu/CentOS/RHEL Desktop
Verwenden Sie das scp
Befehl, um client.p12
herunterzuladen Datei auf Ihren Debian/Ubuntu/CentOS/RHEL-Desktop.
scp [email protected]:/etc/ocserv/ssl/client.p12 ~
Installieren Sie dann openconnect
Client-Software.
Debian/Ubuntu:
sudo apt install openconnect
CentOS/RHEL:
sudo dnf install epel-release sudo dnf install openconnect
Um die Zertifikatsauthentifizierung zu verwenden, führen Sie
aussudo openconnect -b vpn.example.com -c client.p12
Sie werden aufgefordert, den privaten Schlüssel des Clients mit der Passphrase zu entsperren, die Sie zuvor in diesem Tutorial festgelegt haben.
Wenn die Passphrase korrekt eingegeben wurde, sollten Sie jetzt mit dem VPN-Server verbunden sein.
Verwenden der Zertifikatsauthentifizierung auf Windows- und MacOS-Desktops
Laden Sie den OpenConnect-GUI-Client für Windows oder MacOS von der OpenConnect-GUI-Github-Seite herunter. Erstellen Sie dann ein neues VPN-Verbindungsprofil und importieren Sie die PKCS #12-Datei in das Benutzerzertifikatsfeld. Klicken Sie auf die Schaltfläche Speichern. Sie müssen die PIN eingeben, um den privaten Schlüssel zu entsperren. Nach dem Import müssen Sie keinen Benutzernamen und kein Passwort mehr eingeben.
Verwenden der Zertifikatauthentifizierung auf einem iOS-Gerät
iOS-Benutzer können die Cisco AnyConnect-App verwenden. Um das Client-Zertifikat in die AnyConnect-App zu importieren, können Sie zunächst die PKCS #12-Datei in einem Anhang an Ihre E-Mail-Adresse senden. Öffnen Sie dann die Mail-App auf iOS. Tippen Sie einige Sekunden lang auf den Anhang und teilen Sie ihn mit AnyConnect. Geben Sie dann die PIN ein, um die Datei zu importieren.
Bearbeiten Sie nach dem Import Ihre VPN-Verbindung in AnyConnect. Gehen Sie zu Advanced
-> Certificate
und wählen Sie das Client-Zertifikat aus. Speichern Sie Ihre Einstellungen.
Jetzt müssen Sie Benutzername und Passwort nicht mehr auf Ihrem iOS-Gerät eingeben. Die Cisco AnyConnect-App merkt sich den Benutzernamen und das Kennwort nicht, sodass die VPN-Verbindung im Kennwortauthentifizierungsmodus unterbrochen wird, wenn das Telefon nicht verwendet wird. Im Zertifikatauthentifizierungsmodus verbindet sich die App automatisch wieder mit dem VPN-Server, wenn die Verbindung unterbrochen wird.
Probleme mit AnyConnect Client auf iOS
Die neueste Version des AnyConnect-Clients unter iOS hat ein Problem bei der Verwendung der Zertifikatsauthentifizierung im TLS 1.3-Protokoll. Wenn Sie den folgenden Fehler im ocserv-Protokoll sehen (sudo journalctl -eu ocserv
), haben Sie dasselbe Problem.
GnuTLS error (at worker-vpn.c:795): A TLS fatal alert has been received.
Entweder müssen Sie die Kennwortauthentifizierung im AnyConnect iOS-Client verwenden oder TLS 1.3 in der ocserv-Konfigurationsdatei deaktivieren. Um TLS1.3 zu deaktivieren, suchen Sie die tls-priorities
-Parameter in /etc/ocserv/ocserv.conf
Datei und fügen Sie :-VERS-TLS1.3
hinzu am Ende, um TLS 1.3 zu deaktivieren.
tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-RSA:-VERS-SSL3.0:-ARCFOUR-128:-VERS-TLS1.0:-VERS-TLS1.1:-VERS-TLS1.3"
Speichern und schließen Sie die Datei. Starten Sie dann ocserv neu.
sudo systemctl restart ocserv
Hinweis :Wenn Sie SSL 3.3
sehen Satz in den ocserv-Protokollen, keine Panik. SSL 3.3 ist ein anderes Wort für TLS 1.2. Sie verwenden eine sichere TLS-Verbindung.