GNU/Linux >> Tutoriels Linux >  >> Debian

Configurer l'authentification par certificat dans OpenConnect VPN Server (ocserv)

Ce didacticiel vous montrera comment configurer l'authentification par certificat dans le serveur VPN OpenConnect (ocserv) sur Debian/Ubuntu/CentOS/RHEL. OpenConnect (ocserv) est une implémentation open source du protocole Cisco AnyConnect VPN.

Dans un article précédent, j'ai expliqué les étapes pour configurer le serveur VPN OpenConnect avec le certificat de serveur Let's Encrypt TLS. Let's Encrypt ne délivre pas de certificat client, donc dans cet article, nous avons utilisé l'authentification par mot de passe. La saisie du nom d'utilisateur et du mot de passe à chaque fois peut être fastidieuse, surtout si le logiciel client, tel que l'application Cisco AnyConnect sur iOS, n'offre pas la possibilité de mémoriser les mots de passe. De nombreux logiciels clients OpenConnect peuvent importer des certificats d'utilisateur, ce qui libère l'utilisateur de la saisie d'un nom d'utilisateur et d'un mot de passe. L'authentification par certificat est également plus sécurisée que l'authentification par mot de passe.

Exigences

Pour suivre ce tutoriel, il est supposé que vous avez déjà configuré un serveur VPN OpenConnect avec le certificat de serveur Let's Encrypt TLS. Si ce n'est pas le cas, veuillez suivre l'un des didacticiels suivants.

  • Configurer OpenConnect VPN Server (ocserv) sur Ubuntu 20.04 avec Let's Encrypt
  • Configurer le serveur VPN OpenConnect (ocserv) sur Debian 11 Bullseye avec Let's Encrypt
  • Configurer le serveur VPN OpenConnect (ocserv) sur CentOS 8/RHEL 8 avec Let's Encrypt

Nous allons mettre en place notre propre CA (autorité de certification) pour signer le certificat client. Le ocserv Le démon doit continuer à utiliser le certificat de serveur TLS émis par Let's Encrypt, afin que le logiciel client n'affiche pas d'avertissement de sécurité.

Configuration de votre propre autorité de certification (autorité de certification)

Nous voulons utiliser l'authentification par certificat, mais Let's Encrypt n'émet pas de certificat client, nous devons donc créer notre propre autorité de certification. Vous pouvez utiliser openssl pour faire le travail, mais ocserv recommande GnuTLS, donc je vais vous montrer comment utiliser GnuTLS.

Installez gnutls-bin paquet sur le serveur Debian/Ubuntu.

sudo apt install gnutls-bin

Installez gnutls-utils package sur CentOS/RHEL.

sudo dnf installer gnutls-utils

Créez un sous-répertoire dans /etc/ocserv/ pour détenir des clés privées et des certificats.

sudo mkdir /etc/ocserv/ssl/

Changez votre répertoire de travail.

cd /etc/ocserv/ssl/

Générer une clé privée pour l'AC avec le certtool commande, qui est fournie par le gnutls-bin ou gnutls-utils emballer. Par défaut, il génère une clé RSA de 3072 bits, ce qui est suffisant.

sudo certtool --generate-privkey --outfile ca-privkey.pem

Avant de générer le certificat CA, créons le fichier de modèle de certificat CA. Le format de fichier de modèle peut être trouvé dans le manuel de certtool (man certtool ).

sudo nano ca-cert.cfg

Ajoutez les lignes suivantes au fichier. Remplacez les espaces réservés par les valeurs appropriées.

# X.509 Certificate options# L'organisation du sujet.organization ="vpn.example.com"# Le nom commun du propriétaire du certificat.cn ="Example CA"# Le numéro de série du certificat.serial =001# Dans combien de jours, à compter d'aujourd'hui, ce certificat expirera. Utilisez -1 s'il n'y a pas de date d'expiration.expiration_days =-1# S'il s'agit d'un certificat CA ou notca# Si ce certificat sera utilisé pour signer datasigning_key# Si cette clé sera utilisée pour signer d'autres certificats.cert_signing_key# Si cette clé sera utilisé pour signer les CRL.crl_signing_key

Enregistrez et fermez le fichier. Générez maintenant le certificat CA en utilisant les configurations du fichier modèle.

sudo certtool --generate-self-signed --load-privkey ca-privkey.pem --template ca-cert.cfg --outfile ca-cert.pem

Nous avons maintenant un fichier de certificat CA (ca-cert.pem ).

Génération du certificat client

Exécutez maintenant la commande suivante pour générer la clé privée du client.

sudo certtool --generate-privkey --outfile client-privkey.pem

Créez le fichier de modèle de certificat client.

sudo nano client-cert.cfg

Ajoutez les lignes suivantes dans le fichier. L'uid doit être un nom d'utilisateur dans le /etc/ocserv/ocpasswd fichier.

# Options de certificat X.509# L'organisation du sujet.organization ="vpn.example.com"# Le nom commun du propriétaire du certificat.cn ="John Doe"# Un identifiant d'utilisateur du propriétaire du certificat.uid ="username"# Dans combien de jours, à compter d'aujourd'hui, ce certificat expirera. Utilisez -1 s'il n'y a pas de date d'expiration.expiration_days =3650# Si ce certificat sera utilisé pour un serveur TLStls_www_client# Si ce certificat sera utilisé pour signer datasigning_key# Si ce certificat sera utilisé pour chiffrer les données (nécessaire# dans TLS RSA suites de chiffrement). Notez qu'il est préférable d'utiliser des # clés différentes pour le chiffrement et la signature.encryption_key

Enregistrez et fermez le fichier. Exécutez ensuite la commande suivante pour générer un certificat client, qui sera signé par la clé privée de l'autorité de certification.

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

Combinez la clé privée du client et le certificat dans un fichier PKCS #12 protégé par un code PIN.

sudo certtool --to-p12 --load-privkey client-privkey.pem --load-certificate client-cert.pem --pkcs-cipher aes-256 --outfile client.p12 --outder

Nous avons maintenant la clé privée et le certificat du client combinés dans un seul fichier client.p12 .

Notez que l'application Ciso AnyConnect sur iOS ne prend pas en charge le chiffrement AES-256. Il refusera d'importer le certificat client. Si l'utilisateur utilise un appareil iOS, vous pouvez choisir le 3des-pkcs12 chiffrer.

sudo certtool --to-p12 --load-privkey client-privkey.pem --load-certificate client-cert.pem --pkcs-cipher 3des-pkcs12 --outfile ios-client.p12 --outder 

La clé privée et le certificat du client combinés dans un seul fichier ios-client.p12 .

Demande de signature de certificat

Cette étape n'est nécessaire que s'il y a plusieurs utilisateurs VPN et que l'utilisateur souhaite utiliser sa propre clé privée.

Afin de garder secrètes les clés privées des utilisateurs finaux, les utilisateurs peuvent générer une demande de signature de certificat (CSR) avec leurs propres clés privées, puis envoyer des demandes de certificat à l'administrateur, qui délivre ensuite des certificats clients aux utilisateurs. Tout d'abord, ils doivent générer la clé privée et le modèle de certificat client à l'aide des commandes mentionnées ci-dessus. Générez ensuite un CSR avec la commande suivante. Le request.pem le fichier est signé par la clé privée de l'utilisateur.

certtool --generate-request --load-privkey client-privkey.pem --template client-cert.cfg --outfile request.pem

Ensuite, l'utilisateur envoie le request.pem et client-cert.cfg fichier à l'administrateur, qui exécute la commande suivante pour générer le certificat client.

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

Après cela, l'administrateur envoie client-cert.pem fichier de certificat à l'utilisateur.

Activation de l'authentification par certificat dans le démon ocserv

Modifier le fichier de configuration ocserv.

sudo nano /etc/ocserv/ocserv.conf

Dans le didacticiel précédent, nous avons ajouté la ligne suivante pour activer l'authentification par mot de passe.

auth ="plain[passwd=/etc/ocserv/ocpasswd]"

Pour activer l'authentification par certificat, décommentez la ligne suivante.

auth ="certificat"

Si les deux lignes ci-dessus ne sont pas commentées, cela signifie que l'utilisateur doit réussir à la fois l'authentification par mot de passe et l'authentification par certificat. Donc, si l'authentification par certificat suffit à prouver l'identité, commentez la première ligne.

Si vous autorisez les utilisateurs à choisir l'authentification par certificat ou l'authentification par mot de passe, vous devriez avoir les lignes suivantes à la place.

enable-auth ="plain[passwd=/etc/ocserv/ocpasswd]"auth ="certificat"

Trouvez maintenant le paramètre ca-cert. Sur Debian/Ubuntu, il est défini sur

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

Sur CentOS 8/RHEL 8, il est défini sur

ca-cert =/etc/ocserv/ca.pem

Nous devons utiliser notre propre certificat CA pour vérifier le certificat client, alors remplacez cette ligne par

ca-cert =/etc/ocserv/ssl/ca-cert.pem

Ensuite, recherchez la ligne suivante.

cert-user-oid =0.9.2342.19200300.100.1.1

Vous n'avez pas besoin de le changer. Je veux juste vous dire que 0.9.2342.19200300.100.1.1 représente l'UID déposé dans le certificat client. La ligne ci-dessus indique ocserv démon pour trouver le nom d'utilisateur dans le champ UID du certificat client. Si le certificat client est vérifié avec succès par le certificat CA et ocserv le démon peut trouver un nom d'utilisateur correspondant dans /etc/ocserv/ocpasswd fichier, le client peut alors se connecter.

Enregistrez et fermez le fichier. Redémarrez ensuite ocserv.

sudo systemctl redémarrer ocserv

Utilisation de l'authentification par certificat sur Debian/Ubuntu/CentOS/RHEL Desktop

Utilisez le scp commande pour télécharger le client.p12 fichier sur votre bureau Debian/Ubuntu/CentOS/RHEL.

scp [protégé par e-mail] :/etc/ocserv/ssl/client.p12 ~

Ensuite, installez le openconnect logiciel client.

Debian/Ubuntu :

sudo apt install openconnect

CentOS/RHEL :

sudo dnf installer epel-releasesudo dnf installer openconnect

Pour utiliser l'authentification par certificat, exécutez

sudo openconnect -b vpn.exemple.com -c client.p12

Il vous sera demandé de déverrouiller la clé privée du client avec la phrase de passe que vous avez définie précédemment dans ce didacticiel.

Si la phrase secrète est saisie correctement, vous devriez maintenant être connecté au serveur VPN.

Utilisation de l'authentification par certificat sur Windows et MacOS Desktop

Téléchargez le client OpenConnect GUI pour Windows ou MacOS à partir de la page Github de l'interface graphique OpenConnect. Créez ensuite un nouveau profil de connexion VPN et importez le fichier PKCS #12 dans le champ du certificat utilisateur. Cliquez sur le bouton Enregistrer. Vous devrez entrer le code PIN pour déverrouiller la clé privée. Une fois importé, vous n'avez plus besoin de saisir le nom d'utilisateur et le mot de passe.

Utilisation de l'authentification par certificat sur un appareil iOS

Les utilisateurs iOS peuvent utiliser l'application Cisco AnyConnect. Pour importer le certificat client dans l'application AnyConnect, vous pouvez d'abord envoyer le fichier PKCS #12 à votre adresse e-mail dans une pièce jointe. Ouvrez ensuite l'application de messagerie sur iOS. Appuyez sur la pièce jointe quelques secondes et partagez-la avec AnyConnect. Entrez ensuite le code PIN pour importer le fichier.

Une fois importé, modifiez votre connexion VPN dans AnyConnect. Allez dans Advanced -> Certificate et sélectionnez le certificat client. Enregistrez vos paramètres.

Désormais, vous n'avez plus besoin de saisir le nom d'utilisateur et le mot de passe sur votre appareil iOS. L'application Cisco AnyConnect ne se souvient pas du nom d'utilisateur et du mot de passe, donc en mode d'authentification par mot de passe, la connexion VPN sera interrompue lorsque le téléphone n'est pas utilisé. En mode d'authentification par certificat, l'application se reconnectera automatiquement au serveur VPN si la connexion est interrompue.

Problèmes avec le client AnyConnect sur iOS

La dernière version du client AnyConnect sur iOS a un problème lors de l'utilisation de l'authentification par certificat dans le protocole TLS 1.3. Si vous voyez l'erreur suivante dans le journal ocserv (sudo journalctl -eu ocserv ), vous avez le même problème.

Erreur GnuTLS (sur worker-vpn.c:795) :une alerte fatale TLS a été reçue.

Soit vous devez utiliser l'authentification par mot de passe dans le client AnyConnect iOS, soit désactiver TLS 1.3 dans le fichier de configuration ocserv. Pour désactiver TLS1.3, recherchez les tls-priorities paramètre dans le /etc/ocserv/ocserv.conf fichier et ajoutez :-VERS-TLS1.3 à la fin pour désactiver TLS 1.3.

tls-priorities ="NORMAL :%SERVER_PRECEDENCE :%COMPAT :-RSA :-VERS-SSL3.0 :-ARCFOUR-128 :-VERS-TLS1.0 :-VERS-TLS1.1 :-VERS -TLS1.3 "

Enregistrez et fermez le fichier. Redémarrez ensuite ocserv.

sudo systemctl redémarrer ocserv

Remarque :Si vous voyez le SSL 3.3 phrase dans les journaux ocserv, ne paniquez pas. SSL 3.3 est un autre mot pour TLS 1.2. Vous utilisez une connexion TLS sécurisée.


Debian
  1. Comment configurer WireGuard VPN sur Ubuntu (un guide étape par étape)

  2. Comment configurer et configurer une autorité de certification sur Ubuntu 22.04

  3. Serveur VPN PPTP

  4. Comment configurer un serveur SFTP sur le serveur Debian 11

  5. Configurer l'authentification multifacteur pour SSH sur Ubuntu 20.04

Configurez votre propre serveur VPN WireGuard sur Debian 11 et Debian 10

Configurer le serveur VPN OpenConnect (ocserv) sur Debian 10 Buster

Configurer OpenConnect VPN Server (ocserv) sur Ubuntu 18.04/16.04 avec Let's Encrypt

Configurer le serveur VPN OpenConnect (ocserv) sur Ubuntu 20.04 avec Let's Encrypt

Configurer l'authentification à deux facteurs SSH (2FA) sur le serveur Ubuntu

Comment configurer un Vpn Pptp sur le propre serveur Ubuntu ?