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 :

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#

  1. D’abord, nous devons activer le transfert d’IP en éditant le fichier /etc/sysctl.conf.

    $ editor /etc/sysctl.conf
    
  2. Décommentez ou modifiez en conséquence la ligne suivante

    net.ipv4.ip_forward=1
    
  3. Fermez après l’avoir sauvegardé, et entrez cette commande

    $ sysctl -p
    

    Une 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 :

  4. 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 -
    
  5. 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
    # exit
    

    Nous avons téléchargé OpenVPN 2.5 car « password prompt » nécessite au moins OpenVPN version 2.4.8 pour se connecter.

  6. Ensuite, nous téléchargeons OpenVPN

    $ sudo apt install openvpn
    

    Si 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 :

  1. 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.tgz
    
  2. Extraire 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.

  1. Créer un fichier « vars ».

    $ touch ~/easyrsa/vars
    $ cd easyrsa/
    $ editor vars
    
  2. Une 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.

  3. 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-pki
    

    Aprè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 :

  1. The server, and each client, must have their own cert and key

    file. The server and all clients will use the same CA file.

  2. Le certificat du serveur doit avoir les éléments suivants :

  • Utilisation de la clé : signature numérique, chiffrement de la clé

  • extendedKeyUsage : serverAuth

  1. 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 nopass
    

    Cela 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.

  2. 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 (ou server.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.

  1. 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.

    1. 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=private
      
    2. Créer le répertoire openvpn/ sous certificate-authority/

      $ mkdir/opt/certificate-authority/
      $ cd /opt/certificate-authority/
      
    3. 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.crt
      
  2. Récupérer le fichier server.crt sur la machine serveur

    1. Transférez les certificats signés vers le serveur

      Depuis la machine CA, copiez les fichiers server.crt et chain.crt sur le serveur OpenVPN. Dans cet exemple, nous allons utiliser la commande scp comme suit :

      $ scp openvpn/{server.crt,chain.crt} admin@your_openvpnserver_ip:/tmp
      
    2. Placez les certificats dans le répertoire du serveur

      $ mv /tmp/{server.crt,chain.crt} /etc/openvpn/server
      

      Avertissement

      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 fichier chain.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.key

Voici 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 version

Pour 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@server

Pour vérifier doublement si le service OpenVPN est actif, utilisez cette commande :

$ sudo systemctl status openvpn@server

L’OpenVPN devrait fonctionner à ce stade.


Configuration côté client#

1. Installer OpenVPN et Easy-RSA#

  1. 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-rsa
    
  2. Ensuite, nous créons en tant que non-root un répertoire pour Easy RSA appelé Easy-RSA.

    $ mkdir ~/easyrsa
    
  3. Et 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 fichier client.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 fichier server.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 3

Vous pouvez voir si la clé est effectivement stockée sur la Nitrokey en utilisant cette commande :

$ pkcs15-tool -c

Ou alternativement

$ pkcs11-tool --list-objects

Pour 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 fichier chain.crt sur la machine cliente, et le stocker dans le répertoire adéquat. Nous pouvons utiliser scp 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 key

Pour 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
  1. 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=%03
    

    Chaque 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'
    
  2. 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 1
    
  3. Configurer 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 1
    
  4. Configure OpenVPN (Windows only)

    Afin d’établir une poignée de main, vous devez configurer OpenSSL inclus dans OpenVPN.

    Créez le répertoire ssl dans C:\Program Files\OpenVPN et créez le fichier openssl.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.

  5. 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#

  1. 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.service
    

    Pour vérifier si le service OpenVPN est actif, utilisez cette commande :

    $ sudo systemctl status openvpn-server@server.service
    
  2. Saisissez 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.