GNU/Linux >> LINUX-Kenntnisse >  >> Debian

Zertifikatsauthentifizierung in OpenConnect VPN Server einrichten (ocserv)

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_key
verwendet

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

eingestellt
ca-cert = /etc/ssl/certs/ssl-cert-snakeoil.pem

Unter CentOS 8/RHEL 8 ist es auf

eingestellt
ca-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

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


Debian
  1. So richten Sie WireGuard VPN auf Ubuntu ein (eine Schritt-für-Schritt-Anleitung)

  2. So richten Sie eine Zertifizierungsstelle unter Ubuntu 22.04 ein und konfigurieren sie

  3. PPTP-VPN-Server

  4. So richten Sie einen SFTP-Server auf Debian 11 Server ein

  5. Richten Sie die mehrstufige Authentifizierung für SSH unter Ubuntu 20.04 ein

Richten Sie Ihren eigenen WireGuard VPN-Server auf Debian 11 &Debian 10 ein

Richten Sie OpenConnect VPN Server (ocserv) auf Debian 10 Buster ein

Richten Sie OpenConnect VPN Server (ocserv) auf Ubuntu 18.04/16.04 mit Let’s Encrypt ein

Richten Sie OpenConnect VPN Server (ocserv) auf Ubuntu 20.04 mit Let’s Encrypt ein

Richten Sie die SSH-Zwei-Faktor-Authentifizierung (2FA) auf dem Ubuntu-Server ein

Wie richte ich ein Pptp-Vpn auf dem eigenen Ubuntu-Server ein?