Konfigurácia OpenVPN pomocou Easy-RSA#

Poznámka

Na tejto príručke sa pracuje a bude sa priebežne aktualizovať. Prosím, berte tento stav do úvahy.

Tento návod ukazuje, ako nakonfigurovať klientov OpenVPN na prihlásenie pomocou Nitrokey Pro 2 alebo Nitrokey Storage 2. Na správu softvérových kľúčov budeme používať Easy-RSA, nástroj, ktorý sa vyvíjal spolu s OpenVPN.

Na podpisovanie certifikátov použijeme Nitrokey HSM 2 nastavený ako Certifikačná autorita, táto príručka sa však nezaoberá nastavením samotnej certifikačnej autority (je to jasné a dobre zdokumentované tu).

Použijeme Easy-RSA, pretože sa zdá, že poskytuje určitú flexibilitu a umožňuje správu kľúčov prostredníctvom externých PKI. Použijeme ho na serveri na vydanie žiadosti o podpis a rovnaký postup zopakujeme na klientovi. Žiadosti o podpísanie certifikátu budú podpísané certifikačnou autoritou na HSM Nitorkey a opätovne odoslané na server a klienta.

Predpoklady#

V nasledujúcej dokumentácii budeme potrebovať 3 rôzne stroje:

  • Server OpenVPN (v. 2.5) na Debiane 10 (virtuálny stroj EC2 - AWS)

  • Klient OpenVPN (v. 2.4.9) na Fedore 30 (lokálny počítač)

  • Certifikačná autorita bude prístupná zo samostatného počítača s Fedorou 30 (lokálny počítač)

Na interakciu so zariadeniami budeme potrebovať OpenSC 0.20 nainštalovaný na klientskom počítači a počítači CA (miestne počítače). Môžete postupovať podľa pokynov na jeho nastavenie v tomto odkaze (*Unix).

Na stiahnutie závislostí na počítačoch Fedora môžeme použiť tento návod:

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

Pre Debian Linux sú novšie balíky OpenSC k dispozícii tu.

Na správu fyzických kľúčov budeme používať nasledujúce Nitrokeys:

Pripomíname, že pri vytváraní certifikačnej autority na Nitrokey HSM 2 môžete postupovať podľa pokynov, ktoré sú k dispozícii ` v dokumentácii <certificate-authority.html#sign-a-server-certificate>`_.

Prípadne môžete nastaviť vlastnú certifikačnú autoritu na na samostatnom počítači, alebo použiť návod OpenVPN, ktorý sa tiež spolieha na Easy-RSA. Posledné 2 možnosti sa spoliehajú na softvérové riešenia na správu kľúčov.


Na strane servera#

1. Nainštalujte OpenVPN#

  1. Najprv musíme povoliť IP Forwarding úpravou súboru /etc/sysctl.conf

$ editor /etc/sysctl.conf
  1. Zrušte komentár alebo zodpovedajúcim spôsobom upravte nasledujúci riadok

net.ipv4.ip_forward=1
  1. Po uložení ho zavrite a zadajte tento príkaz

$ sysctl -p

Po dokončení presmerovania IP adries si budeme musieť stiahnuť najnovšiu verziu OpenvPN pre náš server Debian 10 podľa týchto pokynov:

  1. Zmeňte sa na roota a stiahnite kľúč GPG, ktorý podpísal balík

$ sudo -s
# wget -O - https://swupdate.openvpn.net/repos/repo-public.gpg|apt-key add -
  1. Pridanie adresy URL príslušných balíkov OpenVPN do súboru sources.list

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

Stiahli sme OpenVPN 2.5, pretože „výzva na zadanie hesla“ vyžaduje na prihlásenie aspoň OpenVPN verzie 2.4.8.

  1. Ďalej stiahneme OpenVPN

$ sudo apt install openvpn

Ak chcete skontrolovať verziu, je to možné zavolaním --version a vypísaním nasledujúceho:

$ 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. Nainštalujte Easy-RSA#

Na vytvorenie PKI stiahneme na server a klientske počítače najnovšiu verziu Easy-RSA. Ak chcete získať najnovšiu verziu, prejdite na stránku Releases na oficiálnom projekte EasyRSA GitHub, skopírujte odkaz na stiahnutie súboru končiaceho na .tgz a potom ho vložte do nasledujúceho príkazu:

  1. Stiahnite si najnovšiu verziu

$ cd ~
wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.7/EasyRSA-3.0.7.tgz
  1. Rozbalenie balíka tarball

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

3. Vytvorenie PKI pre server OpenVPN#

Pred vytvorením súkromného kľúča a certifikátu servera OpenVPN musíte na serveri OpenVPN vytvoriť miestny adresár infraštruktúry verejných kľúčov. Tento adresár budete používať na správu požiadaviek na certifikát servera a klientov namiesto toho, aby ste ich zadávali priamo na serveri certifikačnej autority.

Ak chcete vytvoriť adresár PKI na serveri OpenVPN, musíte naplniť súbor s názvom vars niektorými predvolenými hodnotami.

  1. Vytvorenie súboru vars

$ touch ~/easyrsa/vars
$ cd easyrsa/
$ editor vars
  1. Po otvorení súboru vložte nasledujúce dva riadky

set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"

Toto sú jediné dva riadky, ktoré potrebujete v tomto vars súbore na vašom serveri OpenVPN, pretože sa nebude používať ako certifikačná autorita. Zabezpečí, aby vaše súkromné kľúče a žiadosti o certifikát boli nakonfigurované tak, aby sa na generovanie kľúčov a bezpečných podpisov pre vašich klientov a server OpenVPN používala kryptografia eliptických kriviek (ECC).

Pokiaľ ide o výber kryptografických algoritmov, postupujem podľa vzoru v tomto návode a môžete si ich prispôsobiť podľa svojich konkrétnych potrieb.

  1. Inicializácia infraštruktúry PKI

Po vyplnení súboru vars môžete pokračovať vo vytváraní adresára PKI. Na tento účel spustite skript easyrsa s voľbou init-pki:

$ ./easyrsa init-pki

Po inicializácii PKI na serveri OpenVPN môžete prejsť k ďalšiemu kroku, ktorým je vytvorenie žiadosti o certifikát servera OpenVPN a súkromného kľúča.

4. Vytvorte server.req a server.key#

Teraz, keď má váš server OpenVPN nainštalované všetky predpoklady, je ďalším krokom vygenerovanie páru kľúčov pozostávajúceho zo súkromného kľúča (ktorý má zostať utajený) a žiadosti o podpis certifikátu (.csr) na vašom serveri OpenVPN.

Všeobecne platí, že v systémoch, kde generujeme kľúč a požiadavku, sa tieto súbory nechávajú nezašifrované pomocou argumentu nopass, pretože servery sa zvyčajne musia spúšťať bez zadávania hesla. Tým sa vygeneruje nešifrovaný kľúč, preto dbajte na dôkladnú ochranu jeho prístupových a súborových práv.

Tip

Poznámky ku konfigurácii z OpenVPN:

  1. Server a každý klient musia mať vlastný súbor s certifikátom a kľúčom. Server a všetci klienti budú používať rovnaký súbor certifikačnej autority.

  2. Certifikát servera by mal mať tieto vlastnosti:

  • keyUsage:  digitalSignature, keyEncipherment

  • extendedKeyUsage: serverAuth

  1. Vytvorenie požiadavky na podpisovanie pre server

Prejdite do adresára ~/easyrsa na serveri OpenVPN ako používateľ, ktorý nie je root, a zadajte nasledujúce príkazy:

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

Tým sa vytvorí súkromný kľúč pre server a súbor žiadosti o certifikát s názvom server.req.

Po získaní podpísaného certifikátu ho prenesiete späť na server OpenVPN.

  1. Skopírujte kľúč do adresára servera OpenVPN

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

Po dokončení týchto krokov ste úspešne vytvorili súkromný kľúč pre váš server OpenVPN. Vytvorili ste tiež žiadosť o podpis certifikátu pre server OpenVPN.

Tip

Prípony súborov pre žiadosti o podpisovanie certifikátov

Prípona súboru, ktorú preberá výučbový program CA a HSM, označuje vytvorenie súboru .csr, avšak Easy-RSA vytvára žiadosti o podpis certifikátu s príponou .req.

Obe prípony budeme používať striedavo, pričom sa uistíme, že do certifikačnej autority prenesieme správne súbory a vygenerujeme konečný certifikát s príponou .crt.

V ďalšej časti tejto príručky podpíšeme .req súbor s našou certifikačnou autoritou nasadenou v zariadení HSM 2. Na tento účel použijem na podpisovanie požiadaviek vyhradené zariadenie.

5. Podpis a načítanie server.crt#

Nasledujúce pokyny vyžadujú prenos súboru server.req (alebo server.csr) do systému CA.

Samotný prenos nie je bezpečnostne citlivý, hoci je rozumné overiť, či sa prijatý súbor zhoduje s kópiou odosielateľa, ak je prenos nedôveryhodný.

Aby som mohol prejsť týmito krokmi, budem sa vo veľkej miere opierať o tento návod na podpisovanie žiadostí o podpis certifikátu, keď sme ich vygenerovali pomocou Easy-RSA.

5.1. Podpíšte súbor server.req#

Na lokálnom počítači určenom na prístup k HSM použijeme nástroje, ktoré poskytuje Opensc 0.20, aby sme podpísali súbor .req a odoslali ho späť na server OpenVPN. Predpokladáme, že sme súbor preniesli zo serverového počítača do počítača CA.

Najskôr začneme zapojením HSM Nitrokey a zadáme tento pokyn pre zoznam dostupných kľúčov.

  1. Vyhľadanie zoznamu dostupných zariadení

  $ p11tool --list-all

**(Required step)** If this is the first time you sign a certificate with the CA, you might want to retrieve the URI of the CA’s private key from the HSM, and include it in the config file.
  • URI kľúča by malo byť v tomto formáte:

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
  1. Vytvorenie openvpn/ adresára pod certificate-authority/

$ mkdir/opt/certificate-authority/
$ cd /opt/certificate-authority/
  1. Podpíš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

5.2. Načítanie súboru server.crt do počítača servera#

  1. Prenos podpísaných certifikátov na server

Z počítača CA skopírujte súbory server.crt a chain.crt na server OpenVPN. V tomto príklade použijeme príkaz scp podľa nasledujúceho postupu:

$ scp openvpn/{server.crt,chain.crt} admin@your_openvpnserver_ip:/tmp
  1. Umiestnenie certifikátov do adresára servera

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

Varovanie

Certifikát CA a chain.crt

V uvedenom prípade certifikačná autorita vráti podpísaný certifikát sever a obsahuje certifikát certifikačnej autority CA.crt, ktorý je chain.crt súborom. Toto sa môže vykonať cez nezabezpečený kanál, hoci klientovi sa odporúča potvrdiť, či je prijatý chain.crt platný, ak je transport nedôveryhodný.

Je možné premenovať súbor chain.crt na CA.crt na cieľovom počítači, v ďalších pokynoch však budeme používať chain.crt.

6. Konfigurácia servera OpenVPN#

Spojenie, ktoré používa TLS, vyžaduje viacero certifikátov a kľúčov na overenie. Teraz, keď sme ich vydali a podpísali, môžeme ich umiestniť do správnych adresárov. Rozdelenie certifikátov a kľúčov, ktoré sa musia nachádzať v koreňovom adresári, je nasledovné:

OpenVPN server

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

Na svojom serveri OpenVPN teraz môžete vytvoriť konfiguračný súbor server.conf pomocou svojho obľúbeného textového editora. Súbor môžete nakonfigurovať podľa svojich potrieb, pričom sa postaráme o zmenu častí certifikátu servera a kľúča podľa názvov, ktoré ste zvolili pre vaše súbory, ktoré sme podpísali:

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

Tu je konfiguračný súbor, ktorý môžeme použiť na testovanie týchto pokynov:

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

Ak chceme otestovať, či konfigurácia funguje správne, môžeme použiť tento príkaz:

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

7. Spustite službu OpenVPN na serveri#

Povoľte službu OpenVPN jej pridaním do systemctl a spustite ju pomocou týchto príkazov:

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

Ak chcete dvakrát skontrolovať, či je služba OpenVPN aktívna, použite tento príkaz:

$ sudo systemctl status openvpn@server

V tomto okamihu by mala byť spustená sieť OpenVPN.


Konfigurácia na strane klienta#

1. Inštalácia OpenVPN a Easy-RSA#

  1. Inštalácia softvéru

Na inštaláciu OpenVPN 2.4.9 a Easy-RSA 3.0.7 môžeme použiť priamo dnf install

$ sudo dnf install openvpn easy-rsa
  1. Potom vytvoríme ako non-root adresár pre Easy RSA s názvom Easy-RSA

$ mkdir ~/easyrsa
  1. A prepojte ho s balíkom Easy RSA, ktorý sme práve nainštalovali

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

2. Vytvorenie PKI pre klienta OpenVPN#

Rovnakým spôsobom, ako sme vytvorili PKI na serveri OpenVPN, vytvoríme PKI pomocou Easy-RSA na strane klienta.

3. Vytvorte client.req a client.key#

Rovnakým spôsobom, ako sme vydali kľúčový pár na serveri, vygenerujeme kľúčový pár pre klienta, ktorý bude pozostávať zo súboru client.req a súboru client.key. Ten musí byť na klientskom počítači utajený.

4. Podpíšte client.req a vystavte client.crt súbor#

Na prenos súboru client.req do počítača CA použijeme rovnaký postup ako pri súbore server.req.

Po prenose podpíšeme na počítači certifikačnej autority súbor so žiadosťou o podpis certifikátu týmto príkazom

$ 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ča CA#

Po vytvorení súboru client.crt zapojíme zariadenie Nitrokey Pro 2 do počítača CA a pomocou tohto príkazu importujeme .crt do zariadenia Pro 2:

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

Pomocou tohto príkazu môžete zistiť, či je kľúč efektívne uložený v zariadení Nitrokey:

$ pkcs15-tool -c

Prípadne

$ pkcs11-tool --list-objects

Viac príkazov nájdete na OpenSC wiki.

6. Získajte súbor chain.crt zo zariadenia CA#

Zatiaľ čo client.crtstored on the nitrokey Pro 2 device, we must retrieve the chain.crt súbor uchovávame na klientskom počítači a ukladáme ho do príslušného adresára. Môžeme použiť scp ako v metóde vysvetlenej v serverovej časti tejto príručky.

7. Nakonfigurujte klienta na interakciu s Nitrokey#

Teraz v klientskom počítači pripojíme Nitrokey Pro a použijeme ho na vytvorenie pripojenia VPN so serverom. Vo všeobecnosti platí, že spojenie, ktoré využíva TLS, si vyžaduje viacero certifikátov a kľúčov na overenie:

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

Pre tento návod môžeme použiť nasledujúci súbor client.conf a podľa toho do neho pridať 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čenie správneho objektu

Každý poskytovateľ PKCS#11 môže podporovať viacero zariadení. Na zobrazenie zoznamu dostupných objektov môžete použiť nasledujúci prí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/súkromný kľúč má jedinečný Serialized id reťazec. V konfiguračnom súbore by mal byť uvedený serializovaný id reťazec požadovaného certifikátu. Môžeme to urobiť pridaním možnosti pkcs11-id s použitím jednoduchých úvodzoviek.

pkcs11-id 'pkcs11:model=pkcs11:model=PKCS%NNNN%20emulated;token=User%20PIN%20%28OpenPGP%20card%29;manufacturer=ZeitControl;serial=000NNNNNN;id=%03'
  1. Pridanie získaného serializovaného ID do konfiguračného súboru

Pomocou obľúbeného textového editora otvorte súbor server.conf a pridajte nasledujúce riadky, pričom dbajte na to, aby ste 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'

Pre ďalšie nastavenia súvisiace s OpenVPN autentizáciou môžete pridať aj niekoľko riadkov na správu kľúčov, hoci je to voliteľné.

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

Voliteľný krok

Ak potrebujete otestovať konfiguráciu s tokenom a bez tokenu na Nitrokey, môžete pridať riadky do toho istého client.conf a príslušné riadky komentovať/nekomentovať podľa svojich potrieb:

Poznámka

Kliknutím zobrazíte kód

# non_nitrokey login

# cert client.crt
# key client.key
# tls-auth ta.key 1
  1. Konfigurácia klienta OpenVPN

Konečný konfiguračný súbor client.conf by mal vyzerať 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
  1. Známe problémy

Existujú niektoré známe problémy súvisiace s prihlásením do OpenVPN pomocou OpenSC. Prosím, prečítajte si tieto problémy tu.

8. Spustite klienta OpenVPN#

  1. Spustenie služby OpenVPN v klientovi

Povoľte službu OpenVPN a spustite ju pomocou týchto príkazov:

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

Ak chcete dvakrát skontrolovať, či je služba OpenVPN aktívna, použite tento príkaz:

$ sudo systemctl status openvpn-server@server.service
  1. Zadajte svoj používateľský kód PIN

Pri spustení klienta OpenVPN je potrebné zadať 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: ******

Varovanie

Bohužiaľ sa zdá, že OpenVPN nedokáže vytvoriť handshake a zastaví sa na chybe, ako je uvedené zde, zde a zde

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 niektorých hlásených prípadoch sa na termináli nevyžaduje zadanie kódu PIN. Jedným z riešení by bolo použitie tohto príkazu na prihlásenie pomocou kódu PIN:

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

Prípadne môžete prekompilovať klienta OpenVPN s vypnutou podporou systemd a ten vás podľa očakávania vyzve na zadanie kódu PIN.

Ďalšou možnosťou je prihlásiť sa do inštancie OpenVPN pomocou klienta Viscosity, ktorý poskytuje lepší používateľský komfort, najmä pri zadávaní kódu PIN.