Konfigurace OpenVPN pomocí Easy-RSA#

Poznámka

Na této příručce se pracuje a bude průběžně aktualizována. Vezměte prosím tento stav na vědomí.

Tento návod ukazuje, jak nakonfigurovat klienty OpenVPN pro přihlášení pomocí Nitrokey Pro 2 nebo Nitrokey Storage 2. Pro správu softwarových klíčů budeme používat Easy-RSA, nástroj, který se vyvíjel souběžně s 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).

Použijeme Easy-RSA, protože se zdá, že poskytuje určitou flexibilitu a umožňuje správu klíčů prostřednictvím externích PKI. Použijeme ji na serveru k vydání požadavku na podepsání a stejný postup zopakujeme na klientovi. Žádosti o podepsání certifikátu budou podepsány certifikační autoritou na HSM Nitorkey a znovu odeslány na server a klientovi.

Předpoklady#

V následující dokumentaci budeme potřebovat 3 různé stroje:

  • Server OpenVPN (v. 2.5) na Debianu 10 (virtuální stroj EC2 - AWS)

  • Klient OpenVPN (v. 2.4.9) na Fedoře 30 (místní počítač)

  • Certifikační autorita bude přístupná ze samostatného počítače s Fedorou 30 (místní počítač).

K interakci se zařízeními budeme potřebovat OpenSC 0.20 nainstalovaný na klientském počítači a počítači CA (místní počítače). Můžete postupovat podle pokynů k nastavení v tomto odkazu (*Unix).

Pro stažení závislostí na počítačích Fedora můžeme použít tento návod:

su -c 'dnf install readline-devel openssl-devel libxslt docbook-style-xsl pcsc-lite-devel automake autoconf libtool gcc zlib-devel'

Pro Debian Linux jsou novější balíčky OpenSC k dispozici zde.

Pro správu fyzických klíčů budeme používat následující Nitrokeys:

Připomínáme, že pro vytvoření certifikační autority v systému Nitrokey HSM 2 můžete postupovat podle pokynů dostupných v dokumentaci.

Případně můžete nastavit vlastní certifikační autoritu na na samostatném počítači, nebo použít výukový program OpenVPN, který se také spoléhá na Easy-RSA. Poslední dvě možnosti spoléhají na softwarová řešení pro správu klíčů.


Na straně serveru#

1. Nainstalujte OpenVPN#

  1. Nejprve musíme povolit předávání IP adres úpravou souboru /etc/sysctl.conf.

    $ editor /etc/sysctl.conf
    
  2. Zrušte komentář nebo odpovídajícím způsobem upravte následující řádek

    net.ipv4.ip_forward=1
    
  3. Po uložení jej zavřete a zadejte tento příkaz

    $ sysctl -p
    

    Po dokončení přesměrování IP adres musíme stáhnout nejnovější verzi OpenvPN pro náš server Debian 10 podle těchto pokynů:

  4. Změňte se na uživatele root a stáhněte klíč GPG, kterým je balíček podepsán.

    $ sudo -s
    # wget -O - https://swupdate.openvpn.net/repos/repo-public.gpg|apt-key add -
    
  5. Přidejte adresu URL příslušných balíčků OpenVPN do souboru sources.list.

    # echo "deb http://build.openvpn.net/debian/openvpn/release/2.5 buster main" > /etc/apt/sources.list.d/openvpn-aptrepo.list
    # exit
    

    Stáhli jsme OpenVPN 2.5, protože „výzva k zadání hesla“ vyžaduje k přihlášení alespoň OpenVPN verze 2.4.8.

  6. Dále stáhneme OpenVPN

    $ sudo apt install openvpn
    

    Pokud chcete zkontrolovat verzi, je to možné voláním --version a vypsáním následujícího:

    $ 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. Nainstalujte Easy-RSA#

Pro vytvoření PKI stáhneme na server a klientské počítače nejnovější verzi Easy-RSA. Chcete-li získat nejnovější verzi, přejděte na stránku Releases na oficiálním projektu EasyRSA GitHub, zkopírujte odkaz na stažení souboru končícího .tgz a poté jej vložte do následujícího příkazu:

  1. Stáhněte si nejnovější verzi

    $ cd ~
    $ wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.7/EasyRSA-3.0.7.tgz
    
  2. Rozbalení balíčku tarball

    $ cd ~
    $ tar xvf EasyRSA-3.0.7.tgz
    $ mv EasyRSA-3.0.7/ easyrsa/ # rename folder
    

3. Vytvoření PKI pro server OpenVPN#

Před vytvořením soukromého klíče a certifikátu serveru OpenVPN je třeba na serveru OpenVPN vytvořit místní adresář infrastruktury veřejných klíčů. Tento adresář budete používat ke správě žádostí o certifikát serveru a klientů, místo abyste je zadávali přímo na serveru certifikační autority.

Chcete-li na serveru OpenVPN vytvořit adresář PKI, musíte naplnit soubor s názvem vars některými výchozími hodnotami.

  1. Vytvoření souboru vars

    $ touch ~/easyrsa/vars
    $ cd easyrsa/
    $ editor vars
    
  2. Po otevření souboru vložte následující dva řádky

    set_var EASYRSA_ALGO "ec"
    set_var EASYRSA_DIGEST "sha512"
    

    Toto jsou jediné dva řádky, které potřebujete v tomto souboru vars na serveru OpenVPN, protože nebude použit jako certifikační autorita. Zajistí, že vaše soukromé klíče a žádosti o certifikát budou nakonfigurovány tak, aby používaly kryptografii eliptických křivek (ECC) pro generování klíčů a bezpečné podpisy pro vaše klienty a server OpenVPN.

    Co se týče výběru kryptografických algoritmů, řídím se vzorem uvedeným v tomto návodu a můžete si je přizpůsobit podle svých konkrétních potřeb.

  3. Inicializace infrastruktury PKI

    Po vyplnění souboru vars můžete pokračovat ve vytváření adresáře PKI. Za tímto účelem spusťte skript easyrsa s volbou init-pki:

    $ ./easyrsa init-pki
    

    Po inicializaci PKI na serveru OpenVPN můžete přejít k dalšímu kroku, kterým je vytvoření žádosti o certifikát serveru OpenVPN a soukromého klíče.

4. Vytvořte server.req a server.key.#

Nyní, když má váš server OpenVPN nainstalovány všechny předpoklady, je dalším krokem vygenerování páru klíčů složeného ze soukromého klíče (který má zůstat utajen) a žádosti o podepsání certifikátu (.csr) na serveru OpenVPN.

Obecně lze říci, že v systémech, kde generujeme klíč a požadavek, se tyto soubory nechávají nezašifrované pomocí argumentu nopass, protože servery se obvykle musí spouštět bez zadávání hesla. Tím se vygeneruje nešifrovaný klíč, proto dbejte na pečlivou ochranu jeho přístupových a souborových práv.

Tip

Poznámky ke konfiguraci z 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. Certifikát serveru by měl obsahovat následující údaje:

  • keyUsage:  digitalSignature, keyEncipherment

  • extendedKeyUsage: serverAuth

  1. Vytvoření požadavku na podepsání serveru

    Přejděte do adresáře ~/easyrsa na serveru OpenVPN jako uživatel bez oprávnění root a zadejte následující příkazy:

    $ cd easyrsa/
    $ ./easyrsa gen-req server nopass
    

    Tím se vytvoří soukromý klíč pro server a soubor žádosti o certifikát s názvem server.req.

    Jakmile budete mít podepsaný certifikát, přenesete jej zpět na server OpenVPN.

  2. Zkopírování klíče do adresáře serveru OpenVPN

    $ sudo cp /home/admin/EasyRSA/pki/private/server.key /etc/openvpn/server/
    

Po dokončení těchto kroků jste úspěšně vytvořili soukromý klíč pro server OpenVPN. Také jste vygenerovali žádost o podepsání certifikátu pro server OpenVPN.

Tip

Přípony souborů pro žádosti o podepsání certifikátu

Přípona souboru, kterou přejímá výukový program certifikační autority a HSM, označuje vytvoření souboru .csr, avšak Easy-RSA vytváří žádosti o podepsání certifikátu s příponou .req.

Obě přípony budeme používat střídavě, přičemž se ujistíme, že do certifikační autority přeneseme správné soubory, a vygenerujeme konečný certifikát s příponou .crt.

V další části této příručky podepíšeme .req soubor s naší certifikační autoritou nasazenou v zařízení HSM 2. K tomuto účelu budu používat vyhrazený stroj pro podepisování požadavků.

5. Podepsat a načíst server.crt#

Následující pokyny vyžadují přenos souboru server.req (nebo server.csr) do systému CA.

Samotný přenos není bezpečnostně citlivý, i když je vhodné ověřit, zda se přijatý soubor shoduje s kopií odesílatele, pokud je přenos nedůvěryhodný.

Při těchto krocích se budu ve velké míře opírat o tento návod, abychom mohli podepisovat žádosti o podepsání certifikátu, jakmile je vygenerujeme pomocí Easy-RSA.

  1. Podepište soubor server.req

    Na místním počítači určeném pro přístup k HSM použijeme nástroje poskytované Opensc 0.20 k podepsání souboru .req a jeho odeslání zpět na server OpenVPN. Předpokládáme, že jsme soubor přenesli ze serverového počítače do počítače certifikační autority.

    Nejprve začneme připojením HSM Nitrokey a zadáme tento pokyn pro výpis dostupných kláves.

    1. Dotaz na seznam dostupných zařízení

      $ p11tool --list-all
      

      (Povinný krok) Pokud podepisujete certifikát pomocí certifikační autority poprvé, možná budete chtít načíst URI soukromého klíče certifikační autority z HSM a zahrnout jej do konfiguračního souboru.

      Poznámka

      URI klíče by měl být v tomto formátu:

      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. Vytvoření openvpn/ adresáře pod certificate-authority/.

      $ mkdir/opt/certificate-authority/
      $ cd /opt/certificate-authority/
      
    3. Podepište 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. 5.2. Načtení souboru server.crt do počítače serveru

    1. Přenos podepsaných certifikátů na server

      Z počítače certifikační autority zkopírujte soubory server.crt a chain.crt na server OpenVPN. V tomto příkladu použijeme příkaz scp podle následujících pokynů:

      $ scp openvpn/{server.crt,chain.crt} admin@your_openvpnserver_ip:/tmp
      
    2. Umístění certifikátů do adresáře serveru

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

      Varování

      Certifikát certifikační autority a chain.crt

      Ve výše uvedeném případě certifikační autorita vrátí podepsaný certifikát sever a obsahuje certifikát certifikační autority CA.crt, což je chain.crt soubor. To lze provést nezabezpečeným kanálem, ačkoli klientovi se doporučuje potvrdit, zda je přijatý chain.crt platný, pokud je transport nedůvěryhodný.

      Na cílovém počítači je možné přejmenovat soubor chain.crt na CA.crt, my však v dalších pokynech použijeme chain.crt.

6. Konfigurace serveru OpenVPN#

Připojení, které používá TLS, vyžaduje více certifikátů a klíčů pro ověřování. Nyní, když jsme je vydali a podepsali, je můžeme umístit do správných adresářů. Rozdělení certifikátů a klíčů, které musí být umístěny v kořenovém adresáři, je následující:

OpenVPN server

    - The root certificate file (CA.crt or chain.crt in our setup)
    - Server certificate
    - Server key
    - Diffie Hellman Parameters (optional)

Na serveru OpenVPN nyní můžete vytvořit konfigurační soubor server.conf pomocí svého oblíbeného textového editoru. Soubor můžete nakonfigurovat podle svých potřeb, přičemž se ujistíme, že jste změnili sekce certifikátu serveru a klíče podle názvů, které jste zvolili pro vaše soubory, které jsme podepsali:

# OpenVPN Server Certificate - CA, server key and certificate
ca chain.crt
cert server.crt
key server.key

Zde je konfigurační soubor, který můžeme použít pro testování těchto pokynů:

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

Pro otestování, zda konfigurace funguje správně, můžeme použít tento příkaz:

$ sudo openvpn --server --config server.conf

7. Spusťte službu OpenVPN na serveru#

Službu OpenVPN povolte přidáním do systemctl a spusťte ji pomocí těchto příkazů:

$ sudo systemctl -f enable openvpn@server
$ sudo systemctl start openvpn@server

Chcete-li dvakrát ověřit, zda je služba OpenVPN aktivní, použijte tento příkaz:

$ sudo systemctl status openvpn@server

V tomto okamžiku by měla být spuštěna síť OpenVPN.


Konfigurace na straně klienta#

1. Nainstalujte OpenVPN a Easy-RSA#

  1. Instalace softwaru

    K instalaci OpenVPN 2.4.9 a Easy-RSA 3.0.7 můžeme použít přímo dnf install.

    $ sudo dnf install openvpn easy-rsa
    
  2. Poté vytvoříme jako nekořenový adresář pro Easy RSA s názvem Easy-RSA.

    $ mkdir ~/easyrsa
    
  3. A propojte jej s balíčkem Easy RSA, který jsme právě nainstalovali.

    $ ln -s /usr/share/easy-rsa/3/* ~/easyrsa/
    

2. Vytvoření PKI pro klienta OpenVPN#

Stejným způsobem, jakým jsme vytvořili PKI na serveru OpenVPN, vytvoříme PKI pomocí Easy-RSA na straně klienta.

3. Vytvořte client.req a client.key.#

Stejným způsobem, jakým jsme vydali pár klíčů na serveru, vygenerujeme pár klíčů pro klienta, který se bude skládat ze souboru client.req a souboru client.key. Ten musí být na klientském počítači utajen.

4. Podepište client.req a vydejte client.crt soubor.#

Pro přenos souboru client.req do počítače CA použijeme stejný postup jako v případě souboru server.req.

Po přenosu podepíšeme na počítači certifikační autority soubor se žádostí o podepsání certifikátu tímto příkazem.

$ 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. Import client.crt na Nitrokey z počítače CA.#

Po vytvoření souboru client.crt připojíme zařízení Nitrokey Pro 2 k počítači CA a pomocí tohoto příkazu importujeme .crt do zařízení Pro 2:

$ pkcs15-init --store-certificate client.crt --id 3

Pomocí tohoto příkazu můžete zjistit, zda je klíč v systému Nitrokey skutečně uložen:

$ pkcs15-tool -c

Případně

$ pkcs11-tool --list-objects

Další příkazy najdete na OpenSC wiki.

6. Získejte soubor chain.crt ze stroje CA.#

While we keep the client.crtstored on the nitrokey Pro 2 device, we must retrieve the chain.crt file on the client machine, and store it in the adequate directory. We may use scp as in the method explained in the server section of this guide.

7. Konfigurace klienta pro interakci se systémem Nitrokey#

Nyní v klientském počítači připojíme Nitrokey Pro a použijeme jej k navázání spojení VPN se serverem. Obecně lze říci, že připojení, které využívá TLS, vyžaduje pro ověření více certifikátů a klíčů:

OpenVPN client
    - The root certificate file (`chain.crt`)
    - Client certificate
    - Client key

Pro tento návod můžeme použít následující soubor client.conf a přidat do něj požadované možnosti:

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. Určete správný objekt

    Každý zprostředkovatel PKCS#11 může podporovat více zařízení. Pro zobrazení seznamu dostupných objektů můžete použít následující příkaz:

    $ 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
    

    Každý pár certifikát/soukromý klíč má jedinečný Serialized id řetězec. V konfiguračním souboru by měl být uveden serializovaný řetězec id požadovaného certifikátu. To můžeme provést přidáním možnosti pkcs11-id s použitím jednoduchých uvozovek.

    pkcs11-id 'pkcs11:model=pkcs11:model=PKCS%NNNN%20emulated;token=User%20PIN%20%28OpenPGP%20card%29;manufacturer=ZeitControl;serial=000NNNNNN;id=%03'
    
  2. Přidání načteného serializovaného ID do konfiguračního souboru

    Pomocí oblíbeného textového editoru otevřete soubor server.conf a přidejte následující řádky, přičemž dbejte na to, abyste vložili vlastní Serialized id:

    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'
    

    Pro další nastavení týkající se ověřování OpenVPN můžete také přidat několik řádků pro správu klíčů, i když je to nepovinné.

    Poznámka

    Kliknutím zobrazíte kód

    # 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
    

    Volitelný krok

    Pokud potřebujete otestovat konfiguraci s tokenem a bez něj na Nitrokey, můžete přidat řádky do stejného client.conf a příslušné řádky okomentovat/odkomentovat podle svých potřeb:

    Poznámka

    Kliknutím zobrazíte kód

    # non_nitrokey login
    
    # cert client.crt
    # key client.key
    # tls-auth ta.key 1
    
  3. Konfigurace klienta OpenVPN

    Konečný konfigurační soubor client.conf by měl vypadat takto:

    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)

    Aby bylo možné vytvořit handshake, je třeba nakonfigurovat protokol OpenSSL, který je součástí OpenVPN.

    Create the directory ssl in C:\Program Files\OpenVPN and create file openssl.cnf with the following content :

    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

    Po této úpravě nebudete mít chybu, jak je uvedeno zde, zde a zde.

  5. Známé problémy

    Existují některé známé problémy související s přihlášením k OpenVPN pomocí OpenSC. Tyto problémy naleznete zde.

8. Spusťte klienta OpenVPN#

  1. Spuštění služby OpenVPN v klientovi

    Povolte službu OpenVPN a spusťte ji pomocí těchto příkazů:

    $ sudo systemctl -f enable openvpn-server@server.service
    $ sudo systemctl start openvpn-server@server.service
    

    Chcete-li překontrolovat, zda je služba OpenVPN aktivní, použijte tento příkaz:

    $ sudo systemctl status openvpn-server@server.service
    
  2. Zadejte svůj uživatelský kód PIN

    Při spuštění klienta OpenVPN je třeba zadat PIN kód Nitrokey:

    $ 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: ******
    

    Varování

    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)
    

    V některých hlášených případech nevyžaduje zadání kódu PIN na terminálu. Jedním z řešení by bylo použití tohoto příkazu pro přihlášení pomocí kódu PIN:

    $ telnet 8888 password 'User PIN (OpenPGP card) token' <PIN>
    

    Případně můžete ` znovu zkompilovat klienta OpenVPN <https://forums.openvpn.net/viewtopic.php?f=4&t=23318>`_ s vypnutou podporou systemd a ten vás podle očekávání vyzve k zadání kódu PIN.

    Další možností je přihlásit se k instanci OpenVPN pomocí klienta Viscosity, který poskytuje lepší uživatelský komfort, zejména při zadávání kódu PIN.