Configuration d’OpenVPN avec Easy-RSA#
✓ |
⨯ |
⨯ |
⨯ |
⨯ |
✓ |
✓ |
✓ |
Note
Ce guide est en cours de réalisation et sera mis à jour régulièrement. Veuillez prendre ce statut en considération.
Ce guide montre comment configurer les clients OpenVPN pour qu’ils se connectent en utilisant une Nitrokey Pro 2 ou une Nitrokey Storage 2. Pour la gestion des clés logicielles, nous utiliserons Easy-RSA, un utilitaire qui a évolué parallèlement à OpenVPN.
To sign the certificates, we will use a Nitrokey HSM 2 set up as Certificate Authority, however this guide does not cover the set up of the CA itself (it is clear and well documented here).
Nous utiliserons Easy-RSA, car il semble offrir une certaine flexibilité et permet la gestion des clés via des PKI externes. Nous l’utiliserons sur le serveur pour émettre la demande de signature, et répéterons le même processus sur le client. Les demandes de signature de certificat seront signées par l’autorité de certification sur le Nitorkey HSM, et retransmises au serveur et au client.
Conditions préalables#
Dans la documentation suivante, nous aurons besoin de 3 machines différentes comme suit :
Serveur OpenVPN (v. 2.5) sur Debian 10 (machine virtuelle EC2 - AWS)
Client OpenVPN (v. 2.4.9) sur Fedora 30 (machine locale)
L’autorité de certification sera accessible depuis une machine autonome équipée de Fedora 30 (machine locale).
Pour interagir avec les appareils, nous aurons besoin de OpenSC 0.20 installé sur la machine du client et de l’AC (les machines locales). Vous pouvez suivre les instructions pour le configurer dans ce lien (*Unix).
Pour télécharger les dépendances sur les machines Fedora, nous pouvons suivre cette instruction :
su -c 'dnf install readline-devel openssl-devel libxslt docbook-style-xsl pcsc-lite-devel automake autoconf libtool gcc zlib-devel'
Pour Debian Linux, des paquets OpenSC plus récents sont disponibles ici.
Nous utiliserons les Nitrokeys suivants pour la gestion des clés physiques :
Une clé d’authentification utilisant la `Nitrokey Pro 2 (pdf) <https://www.nitrokey.com/files/doc/Nitrokey_Pro_factsheet.pdf>`___.
Une autorité de certification (CA) utilisant le Nitrokey HSM 2 (pdf).
Pour rappel, pour construire une autorité de certification sur Nitrokey HSM 2, vous pouvez suivre les instructions disponibles dans la documentation.
Vous pouvez également configurer votre propre AC sur une sur une machine séparée, ou utiliser le tutoriel OpenVPN qui s’appuie également sur Easy-RSA. Les 2 dernières options s’appuient sur des solutions logicielles pour la gestion des clés.
Côté serveur#
1. Installer OpenVPN#
D’abord, nous devons activer le transfert d’IP en éditant le fichier
/etc/sysctl.conf
.$ editor /etc/sysctl.confDécommentez ou modifiez en conséquence la ligne suivante
net.ipv4.ip_forward=1Fermez après l’avoir sauvegardé, et entrez cette commande
$ sysctl -pUne fois le transfert d’IP effectué, nous devrons télécharger la dernière version d’OpenvPN pour notre serveur Debian 10, selon ces instructions :
Passez à l’utilisateur root et téléchargez la clé GPG qui a signé le paquet.
$ sudo -s # wget -O - https://swupdate.openvpn.net/repos/repo-public.gpg|apt-key add -Ajoutez l’URL des paquets OpenVPN adéquats au fichier
sources.list
.# echo "deb http://build.openvpn.net/debian/openvpn/release/2.5 buster main" > /etc/apt/sources.list.d/openvpn-aptrepo.list # exitNous avons téléchargé OpenVPN 2.5 car « password prompt » nécessite au moins OpenVPN version 2.4.8 pour se connecter.
Ensuite, nous téléchargeons OpenVPN
$ sudo apt install openvpnSi vous voulez vérifier la version, c’est possible en appelant
--version
et en imprimant ce qui suit :$ sudo openvpn --version OpenVPN 2.5_beta3 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Sep 1 2020 library versions: OpenSSL 1.1.1d 10 Sep 2019, LZO 2.10 Originally developed by James Yonan Copyright (C) 2002-2018 OpenVPN Inc <sales@openvpn.net> Compile time defines: enable_async_push=no enable_comp_stub=no enable_crypto_ofb_cfb=yes enable_debug=yes enable_def_auth=yes enable_dependency_tracking=no \ enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown enable_fast_install=needless enable_fragment=yes enable_iproute2=yes \ enable_libtool_lock=yes enable_lz4=yes enable_lzo=yes enable_maintainer_mode=no enable_management=yes enable_multihome=yes enable_pam_dlopen=no enable_pedantic=no \ enable_pf=yes enable_pkcs11=yes enable_plugin_auth_pam=yes enable_plugin_down_root=yes enable_plugins=yes enable_port_share=yes enable_selinux=no \ enable_shared=yes enable_shared_with_static_runtimes=no enable_silent_rules=no enable_small=no enable_static=yes enable_strict=no enable_strict_options=no \ enable_systemd=yes enable_werror=no enable_win32_dll=yes enable_x509_alt_username=yes with_aix_soname=aix with_crypto_library=openssl with_gnu_ld=yes \ with_mem_check=no with_sysroot=no
2. Installer Easy-RSA#
Pour construire l’ICP, nous allons télécharger la dernière version d’Easy-RSA sur les machines serveur et client. Pour obtenir la dernière version, allez sur la page Releases du projet officiel EasyRSA GitHub, copiez le lien de téléchargement du fichier se terminant par
.tgz
, puis collez-le dans la commande suivante :
Télécharger la dernière version
$ cd ~ $ wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.7/EasyRSA-3.0.7.tgzExtraire l’archive
$ cd ~ $ tar xvf EasyRSA-3.0.7.tgz $ mv EasyRSA-3.0.7/ easyrsa/ # rename folder
3. Créer une PKI pour le serveur OpenVPN#
Avant de pouvoir créer la clé privée et le certificat de votre serveur OpenVPN, vous devez créer un répertoire local Public Key Infrastructure sur votre serveur OpenVPN. Vous utiliserez ce répertoire pour gérer les demandes de certificats du serveur et des clients, au lieu de les faire directement sur votre serveur CA.
Pour construire un répertoire PKI sur votre serveur OpenVPN, vous aurez besoin de remplir un fichier appelé
vars
avec quelques valeurs par défaut.
Créer un fichier « vars ».
$ touch ~/easyrsa/vars $ cd easyrsa/ $ editor varsUne fois le fichier ouvert, collez les deux lignes suivantes
set_var EASYRSA_ALGO "ec" set_var EASYRSA_DIGEST "sha512"Ce sont les deux seules lignes dont vous avez besoin dans ce fichier ``vars`” sur votre serveur OpenVPN puisqu’il ne sera pas utilisé comme Autorité de Certification. Elles assureront que vos clés privées et vos demandes de certificats sont configurées pour utiliser la cryptographie à courbe elliptique (ECC) pour générer des clés et des signatures sécurisées pour vos clients et votre serveur OpenVPN.
En ce qui concerne le choix des algorithmes cryptographiques, je suis le modèle de ce tutoriel, et vous pouvez les personnaliser en fonction de vos besoins spécifiques.
Initialiser l’ICP
Une fois que vous avez rempli le fichier
vars
, vous pouvez procéder à la création du répertoire PKI. Pour ce faire, exécutez le script easyrsa avec l’option init-pki :$ ./easyrsa init-pkiAprès avoir initialisé votre PKI sur le serveur OpenVPN, vous êtes prêt à passer à l’étape suivante, qui consiste à créer une demande de certificat et une clé privée pour le serveur OpenVPN.
4. Créez server.req
et server.key
.#
Maintenant que votre serveur OpenVPN a tous les pré-requis installés, l’étape suivante consiste à générer une paire de clés composée d’une clé privée (à garder secrète), et d’un Certificate Signing Request (
.csr
) sur votre serveur OpenVPN.En termes généraux, sur les systèmes où nous générons une clé et une requête, ces fichiers sont laissés en clair en utilisant l’argument ``nopass`”, puisque les serveurs doivent généralement démarrer sans aucune entrée de mot de passe. Cela génère une clé non chiffrée, il faut donc faire attention à protéger son accès et ses permissions de fichiers.
Astuce
Notes de configuration d’OpenVPN :
- The server, and each client, must have their own cert and key
file. The server and all clients will use the same CA file.
Le certificat du serveur doit avoir les éléments suivants :
Utilisation de la clé : signature numérique, chiffrement de la clé
extendedKeyUsage : serverAuth
Créer la demande de signature pour le serveur
Naviguez dans le répertoire
~/easyrsa
sur votre serveur OpenVPN en tant qu’utilisateur non-root, et entrez les commandes suivantes :$ cd easyrsa/ $ ./easyrsa gen-req server nopassCela va créer une clé privée pour le serveur et un fichier de demande de certificat appelé
server.req
.Une fois que vous avez un certificat signé, vous allez le transférer au serveur OpenVPN.
Copier la clé dans le répertoire du serveur OpenVPN
$ sudo cp /home/admin/EasyRSA/pki/private/server.key /etc/openvpn/server/Après avoir complété ces étapes, vous avez réussi à créer une clé privée pour votre serveur OpenVPN. Vous avez également généré un Certificate Signing Request pour le serveur OpenVPN.
Astuce
Extensions de fichiers pour les demandes de signature de certificats
L’extension de fichier adoptée par le tutoriel CA et HSM indique la création d’un fichier
.csr
, cependant Easy-RSA crée des demandes de signature de certificat avec une extension.req
.Nous utiliserons indifféremment les deux extensions, tout en nous assurant que nous transférons les bons fichiers à l’Autorité de Certification, et que nous générons un certificat final avec une extension
.crt
.Dans la prochaine section de ce guide, nous allons signer un fichier
.req
avec notre CA sur déployé sur le dispositif HSM 2. Pour cela, je vais utiliser une machine dédiée pour signer les requêtes.
5. Signer et récupérer server.crt
#
Les instructions suivantes nécessitent le transfert du fichier
server.req
(ouserver.csr
) vers le système CA.Le transfert lui-même n’est pas sensible à la sécurité, mais il est sage de vérifier si le fichier reçu correspond à la copie de l’expéditeur, si le transport n’est pas fiable.
Afin de suivre ces étapes, je m’appuierai largement sur ces instructions, pour signer les demandes de signature de certificat, une fois que nous les avons générées avec Easy-RSA.
Signer le fichier
server.req
.Sur la machine locale dédiée à l’accès au HSM, nous utiliserons les outils fournis par Opensc 0.20 afin de signer le fichier
.req
, et de le renvoyer au serveur OpenVPN. Nous supposons que nous avons transféré le fichier de la machine serveur à la machine de l’AC.Commençons par brancher le HSM Nitrokey, et entrons dans cette instruction pour lister les touches disponibles.
Interroger la liste des dispositifs disponibles
$ p11tool --list-all(Étape obligatoire) Si c’est la première fois que vous signez un certificat avec l’autorité de certification, vous pouvez récupérer l’URI de la clé privée de l’autorité de certification à partir du HSM et l’inclure dans le fichier de configuration.
Note
L’URI de la clé doit être dans ce format :
pkcs11:model=PKCS%2315%20emulated;manufacturer=www.CardContact.de;serial=DENK0104068;token=SmartCard-HSM%20%28UserPIN%29%00%00%00%00%00%00%00%00%00;id=%E0%16%1C%C8%B6%F5%D6%6A%C6%83%5E%CD%EC%B6%23%FC%05%06%A6%75;object=root;type=privateCréer le répertoire
openvpn/
souscertificate-authority/
$ mkdir/opt/certificate-authority/ $ cd /opt/certificate-authority/Signer le fichier
server.req
.$ openssl ca -config sign_server_csrs.ini -engine pkcs11 -keyform engine -days 375 -notext -md sha512 -create_serial -in server.req -out /home/user/pki/issued/server.crtRécupérer le fichier
server.crt
sur la machine serveur
Transférez les certificats signés vers le serveur
Depuis la machine CA, copiez les fichiers
server.crt
etchain.crt
sur le serveur OpenVPN. Dans cet exemple, nous allons utiliser la commandescp
comme suit :$ scp openvpn/{server.crt,chain.crt} admin@your_openvpnserver_ip:/tmpPlacez les certificats dans le répertoire du serveur
$ mv /tmp/{server.crt,chain.crt} /etc/openvpn/serverAvertissement
Certificat de l’AC et
chain.crt
Dans l’exemple ci-dessus, l’AC renvoie le certificat de sévérité signé, et inclut le certificat d’AC
CA.crt
qui est le fichierchain.crt
. Cela peut être fait sur un canal non sécurisé, mais le client est encouragé à confirmer si la chaîne reçue est valide, si le transport n’est pas fiable.Il est possible de renommer le fichier
chain.crt
en ``CA.crt`” sur la machine cible, cependant nous utiliserons ``chain.crt`” dans les prochaines instructions.
6. Configurer le serveur OpenVPN#
Une connexion qui utilise TLS nécessite plusieurs certificats et clés pour l’authentification. Maintenant que nous avons émis et signé ces derniers, nous pouvons les placer dans les bons répertoires. La répartition des certificats et des clés qui doivent se trouver dans le répertoire racine sont les suivants :
OpenVPN server - The root certificate file (CA.crt or chain.crt in our setup) - Server certificate - Server key - Diffie Hellman Parameters (optional)Sur votre serveur OpenVPN, vous pouvez maintenant créer le fichier de configuration
server.conf
avec votre éditeur de texte préféré. Le fichier peut être configuré selon vos besoins, tandis que nous nous assurons de changer les sections du certificat et de la clé du serveur selon les noms que vous avez choisis pour les fichiers que nous avons signés :# OpenVPN Server Certificate - CA, server key and certificate ca chain.crt cert server.crt key server.keyVoici le fichier de configuration que nous pouvons utiliser pour tester ces instructions :
port 1194 proto udp dev tun ca ca.crt cert server.crt key server.key # This file should be kept secret dh dh.pem server 10.8.0.0 255.255.255.0 push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 208.67.222.222" push "dhcp-option DNS 208.67.220.220" keepalive 10 120 tls-auth ta.key 0 # This file is secret cipher AES-256-CBC user nobody group nogroup persist-key persist-tun status /var/log/openvpn/openvpn-status.log log /var/log/openvpn/openvpn.log log-append /var/log/openvpn/openvpn.log verb 3 explicit-exit-notify 1 tls-version-min 1.2 # Lower boundary for TLS version tls-version-max 1.2 # Higher boundary for TLS versionPour tester si la configuration fonctionne correctement, nous pouvons utiliser cette commande :
$ sudo openvpn --server --config server.conf
7. Démarrer le service OpenVPN sur le serveur#
Activez le service OpenVPN en l’ajoutant à systemctl, et démarrez-le en utilisant ces commandes :
$ sudo systemctl -f enable openvpn@server $ sudo systemctl start openvpn@serverPour vérifier doublement si le service OpenVPN est actif, utilisez cette commande :
$ sudo systemctl status openvpn@serverL’OpenVPN devrait fonctionner à ce stade.
Configuration côté client#
1. Installer OpenVPN et Easy-RSA#
Installer le logiciel
Nous pouvons utiliser directement
dnf install
pour installer OpenVPN 2.4.9 et Easy-RSA 3.0.7$ sudo dnf install openvpn easy-rsaEnsuite, nous créons en tant que non-root un répertoire pour Easy RSA appelé
Easy-RSA
.$ mkdir ~/easyrsaEt le lier au paquet Easy RSA que nous venons d’installer
$ ln -s /usr/share/easy-rsa/3/* ~/easyrsa/
2. Créer une PKI pour le client OpenVPN#
De la même manière que nous avons créé une PKI sur le serveur OpenVPN, nous allons créer une PKI utilisant Easy-RSA du côté client.
3. Créez un client.req
et un client.key
.#
De la même manière que nous avons émis la paire de clés sur le serveur, nous générons une paire de clés pour le client qui sera composée du fichier
client.req
et du fichierclient.key
. Ce dernier doit être gardé secret sur la machine du client.
4. Signer le fichier client.req
et émettre le fichier ``client.crt`”.#
Pour transférer le fichier
client.req
vers la machine de l’AC, nous allons utiliser la même méthode que pour le fichierserver.req
.Une fois transféré, sur la machine de l’AC, nous signons le fichier de demande de signature de certificat avec cette commande
$ openssl ca -config sign_server_csrs.ini -engine pkcs11 -keyform engine -days 375 -notext -md sha512 -create_serial -in client.req -out /home/user/pki/issued/client.crt
5. Importez client.crt
sur la Nitrokey depuis la machine CA#
Après avoir créé le fichier
client.crt
, nous branchons le dispositif Nitrokey Pro 2 sur la machine CA, et importons le.crt
sur le dispositif Pro 2 en utilisant cette commande :$ pkcs15-init --store-certificate client.crt --id 3Vous pouvez voir si la clé est effectivement stockée sur la Nitrokey en utilisant cette commande :
$ pkcs15-tool -cOu alternativement
$ pkcs11-tool --list-objectsPour plus de commandes, vous pouvez vous référer au Wiki OpenSC.
6. Récupérez le fichier chain.crt
de la machine CA#
Alors que nous gardons le fichier
client.crt
stocké sur le périphérique nitrokey Pro 2, nous devons récupérer le fichierchain.crt
sur la machine cliente, et le stocker dans le répertoire adéquat. Nous pouvons utiliserscp
comme dans la méthode expliquée dans la section serveur de ce guide.
7. Configurez le client pour qu’il interagisse avec la Nitrokey#
De retour sur l’ordinateur client, nous allons brancher la Nitrokey Pro et l’utiliser pour établir la connexion VPN avec le serveur. En termes généraux, une connexion qui utilise TLS nécessite plusieurs certificats et clés pour l’authentification :
OpenVPN client - The root certificate file (`chain.crt`) - Client certificate - Client keyPour ce guide, nous pouvons utiliser le fichier
client.conf
suivant, et y ajouter les options requises en conséquence :client dev tun proto udp remote <server> 1194 resolv-retry infinite nobind user nobody group nobody persist-key persist-tun ca ca.crt remote-cert-tls server cipher AES-256-CBC verb 3 redirect-gateway def1 tls-version-min 1.2 # Lower boundary for TLS version tls-version-max 1.2 # Higher boundary for TLS version
Déterminer le bon objet
Chaque fournisseur PKCS#11 peut prendre en charge plusieurs appareils. Afin d’afficher la liste des objets disponibles, vous pouvez utiliser la commande suivante :
$ openvpn --show-pkcs11-ids /usr/lib64/pkcs11/opensc-pkcs11.so The following objects are available for use. Each object shown below may be used as parameter to --pkcs11-id option please remember to use single quote mark. Certificate DN: CN=client Serial: E53DA75C5B8F1518F520BCEF0128C09F Serialized id: pkcs11:model=pkcs11:model=PKCS%NNNN%20emulated;token=User%20PIN%20%28OpenPGP%20card%29;manufacturer=ZeitControl;serial=000NNNNNN;id=%03Chaque paire certificat/clé privée a une chaîne d’identification sérialisée unique. La chaîne d’identification sérialisée du certificat demandé doit être spécifiée dans le fichier de configuration. Nous pouvons le faire en ajoutant l’option
pkcs11-id
en utilisant des guillemets simples.pkcs11-id 'pkcs11:model=pkcs11:model=PKCS%NNNN%20emulated;token=User%20PIN%20%28OpenPGP%20card%29;manufacturer=ZeitControl;serial=000NNNNNN;id=%03'Ajouter l’ID sérialisé récupéré au fichier de configuration
En utilisant votre éditeur de texte préféré, ouvrez le fichier server.conf, et ajoutez les lignes suivantes, en prenant soin d’insérer votre propre
Identifiant sérialisé
:pkcs11-providers /usr/lib64/pkcs11/opensc-pkcs11.so pkcs11-id 'pkcs11:model=pkcs11:model=PKCS%NNNN%20emulated;token=User%20PIN%20%28OpenPGP%20card%29;manufacturer=ZeitControl;serial=000NNNNNN;id=%03'Pour les réglages supplémentaires liés à l’authentification OpenVPN, vous pouvez également ajouter quelques lignes pour gérer la gestion des clés, bien que cela soit facultatif.
Note
Cliquez pour voir le code
# nitrokey config pkcs11-providers /usr/lib64/pkcs11/opensc-pkcs11.so pkcs11-id 'pkcs11:model=pkcs11:model=PKCS%NNNN%20emulated;token=User%20PIN%20%28OpenPGP%20card%29;manufacturer=ZeitControl;serial=000NNNNNN;id=%03' # pkcs11-pin-cache 300 # daemon # auth-retry nointeract # management-hold # management-signal # management 127.0.0.1 8888 # management-query-passwords pkcs11-cert-private 1 # Prompt for PINÉtape facultative
Si vous avez besoin de tester la configuration, avec et sans le jeton sur la Nitrokey, vous pouvez ajouter des lignes au même
client.conf
et commenter/décommenter les lignes pertinentes en fonction de vos besoins :Note
Cliquez pour voir le code
# non_nitrokey login # cert client.crt # key client.key # tls-auth ta.key 1Configurer le client OpenVPN
Le fichier de configuration final
client.conf
devrait ressembler à celui-ci :client dev tun proto udp remote <server> 1194 resolv-retry infinite nobind user nobody group nobody persist-key persist-tun ca ca.crt remote-cert-tls server cipher AES-256-CBC verb 3 redirect-gateway def1 tls-version-min 1.2 # Lower boundary for TLS version tls-version-max 1.2 # Higher boundary for TLS version # nitrokey login pkcs11-providers /usr/lib64/pkcs11/opensc-pkcs11.so pkcs11-id 'pkcs11:model=pkcs11:model=PKCS%NNNN%20emulated;token=User%20PIN%20%28OpenPGP%20card%29;manufacturer=ZeitControl;serial=000NNNNNN;id=%03' # pkcs11-pin-cache 300 # daemon # auth-retry nointeract # management-hold # management-signal # management 127.0.0.1 8888 # management-query-passwords pkcs11-cert-private 1 # Prompt for PIN # OR # non_nitrokey login # cert client.crt # key client.key # tls-auth ta.key 1Configure OpenVPN (Windows only)
Afin d’établir une poignée de main, vous devez configurer OpenSSL inclus dans OpenVPN.
Créez le répertoire
ssl
dansC:\Program Files\OpenVPN
et créez le fichieropenssl.cnf
avec le contenu suivant :openssl_conf = default_conf
[default_conf ] ssl_conf = ssl_sect
[ ssl_sect ] system_default = ssl_default_sect
[ ssl_default_sect ] SignatureAlgorithms = RSA+SHA512:ECDSA+SHA512:RSA+SHA384:ECDSA+SHA384:RSA+SHA256:ECDSA+SHA256 MaxProtocol = TLSv1.2 MinProtocol = TLSv1.2
Avec cette modification, vous n’aurez pas d’erreur comme celle signalée ici, ici et ici.
Problèmes connus
Il y a quelques problèmes connus liés à la connexion OpenVPN avec OpenSC. Veuillez consulter ces problèmes ici.
8. Démarrez le client OpenVPN#
Démarrer le service OpenVPN sur le client
Activez le service OpenVPN, et démarrez-le en utilisant ces commandes :
$ sudo systemctl -f enable openvpn-server@server.service $ sudo systemctl start openvpn-server@server.servicePour vérifier si le service OpenVPN est actif, utilisez cette commande :
$ sudo systemctl status openvpn-server@server.serviceSaisissez votre code PIN utilisateur
Lors de l’exécution du client OpenVPN, le PIN de Nitrokey doit être saisi :
$ sudo openvpn --client --config client.conf Fri Sep 11 17:42:01 2020 OpenVPN 2.4.9 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Apr 24 2020 Fri Sep 11 17:42:01 2020 library versions: OpenSSL 1.1.1g FIPS 21 Apr 2020, LZO 2.08 Fri Sep 11 17:42:01 2020 PKCS#11: Adding PKCS#11 provider '/usr/lib64/pkcs11/opensc-pkcs11.so' Enter User PIN (OpenPGP card) token Password: ******Avertissement
Unfortunately OpenVPN doesn’t seem to be able to establish a handshake on some operating systems and stops at an error as reported here, here and here
This is what the error output looks like: $ sudo openvpn --client --config client.conf Fri Sep 11 17:42:01 2020 OpenVPN 2.4.9 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Apr 24 2020 Fri Sep 11 17:42:01 2020 library versions: OpenSSL 1.1.1g FIPS 21 Apr 2020, LZO 2.08 Fri Sep 11 17:42:01 2020 PKCS#11: Adding PKCS#11 provider '/usr/lib64/pkcs11/opensc-pkcs11.so' Enter User PIN (OpenPGP card) token Password: ******`` Fri Sep 11 17:42:12 2020 TCP/UDP: Preserving recently used remote address: [AF_INET]18.157.180.240:1194`` Fri Sep 11 17:42:12 2020 Socket Buffers: R=[212992->212992] S=[212992->212992]`` Fri Sep 11 17:42:12 2020 UDP link local: (not bound) Fri Sep 11 17:42:12 2020 UDP link remote: [AF_INET]18.157.180.240:1194 Fri Sep 11 17:42:12 2020 NOTE: UID/GID downgrade will be delayed because of --client, --pull, or --up-delay Fri Sep 11 17:42:12 2020 TLS: Initial packet from [AF_INET]18.157.180.240:1194, sid=d79690cf 9e38ce89 Fri Sep 11 17:42:12 2020 VERIFY OK: depth=1, CN=server_CA Fri Sep 11 17:42:12 2020 VERIFY KU OK Fri Sep 11 17:42:12 2020 Validating certificate extended key usage Fri Sep 11 17:42:12 2020 ++ Certificate has EKU (str) TLS Web Server Authentication, expects TLS Web Server Authentication Fri Sep 11 17:42:12 2020 VERIFY EKU OK Fri Sep 11 17:42:12 2020 VERIFY OK: depth=0, CN=server Fri Sep 11 17:42:12 2020 OpenSSL: error:141F0006:SSL routines:tls_construct_cert_verify:EVP lib Fri Sep 11 17:42:12 2020 TLS_ERROR: BIO read tls_read_plaintext error Fri Sep 11 17:42:12 2020 TLS Error: TLS object -> incoming plaintext read error Fri Sep 11 17:42:12 2020 TLS Error: TLS handshake failed Fri Sep 11 17:42:12 2020 SIGUSR1[soft,tls-error] received, process restarting Fri Sep 11 17:42:12 2020 Restart pause, 5 second(s)Dans certains cas, il ne demande pas de code PIN sur le terminal. Une solution de contournement serait d’utiliser cette commande pour se connecter avec le code PIN :
$ telnet 8888 password 'User PIN (OpenPGP card) token' <PIN>Alternativement, vous pourriez recompiler le client OpenVPN avec le support systemd désactivé, et il vous demandera le PIN comme prévu.
Une autre option serait de se connecter à votre instance OpenVPN avec le client Viscosity qui offre une meilleure expérience utilisateur, notamment pour la saisie du PIN.