Configurarea OpenVPN cu Easy-RSA#

Notă

Acest ghid este în curs de realizare și va fi actualizat în funcție de evoluția sa. Vă rugăm să țineți cont de acest statut.

Acest ghid arată cum să configurați clienții OpenVPN pentru a se conecta folosind o Nitrokey Pro 2 sau o Nitrokey Storage 2. Pentru gestionarea cheilor software vom folosi Easy-RSA, un utilitar care a evoluat odată cu 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).

Vom folosi Easy-RSA, deoarece pare să ofere o anumită flexibilitate și permite gestionarea cheilor prin intermediul unor PKI-uri externe. Îl vom utiliza pe server pentru a emite cererea de semnare și vom repeta același proces pe client. Cererile de semnare a certificatelor vor fi semnate de către CA pe Nitorkey HSM și retransmise către server și client.

Condiții prealabile#

În documentația următoare vom avea nevoie de 3 mașini diferite, după cum urmează:

  • Server OpenVPN (v. 2.5) pe Debian 10 (mașină virtuală EC2 - AWS)

  • Client OpenVPN (v. 2.4.9) pe Fedora 30 (mașină locală)

  • Autoritatea de certificare va fi accesibilă de pe o mașină autonomă cu Fedora 30 (mașină locală).

Pentru a interacționa cu dispozitivele vom avea nevoie de OpenSC 0.20 instalat pe client și pe mașina CA (mașinile locale). Puteți urma instrucțiunile pentru a-l configura în acest link (*Unix).

Pentru a descărca dependențele de pe mașinile Fedora, putem urma această instrucțiune:

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

Pentru Debian Linux, pachete OpenSC mai recente sunt disponibile ` aici <https://github.com/Nitrokey/opensc-build>`__.

Vom utiliza următoarele Nitrokeys pentru gestionarea fizică a cheilor:

Vă reamintim că, pentru a construi o autoritate de certificare pe Nitrokey HSM 2, puteți urma instrucțiunile disponibile în documentația.

Alternativ, vă puteți configura propriul CA pe o pe o mașină separată, sau puteți utiliza tutorialul OpenVPN care se bazează, de asemenea, pe Easy-RSA. Ultimele 2 opțiuni se bazează pe soluții software pentru gestionarea cheilor.


Partea serverului#

1. Instalați OpenVPN#

  1. Mai întâi trebuie să activăm IP Forwarding prin editarea fișierului /etc/sysctl.conf`

    $ editor /etc/sysctl.conf
    
  2. Decomentați sau modificați în consecință următoarea linie

    net.ipv4.ip_forward=1
    
  3. Închideți după ce l-ați salvat și introduceți această comandă

    $ sysctl -p
    

    Odată ce redirecționarea IP este realizată, va trebui să descărcăm cea mai recentă versiune de OpenvPN pentru serverul nostru Debian 10, conform acestei instrucțiuni:

  4. Schimbați-vă în root și descărcați cheia GPG care a semnat pachetul

    $ sudo -s
    # wget -O - https://swupdate.openvpn.net/repos/repo-public.gpg|apt-key add -
    
  5. Adăugați URL-ul pachetelor OpenVPN adecvate în fișierul sources.list`.

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

    Am descărcat OpenVPN 2.5 deoarece „password prompt” necesită cel puțin OpenVPN versiunea 2.4.8 pentru a se conecta.

  6. În continuare descărcăm OpenVPN

    $ sudo apt install openvpn
    

    Dacă doriți să verificați versiunea, este posibil prin apelarea --version` și să imprimați următoarele:

    $ 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. Instalați Easy-RSA#

Pentru a construi PKI, vom descărca cea mai recentă versiune a Easy-RSA pe server și pe mașinile client. Pentru a obține cea mai recentă versiune, accesați pagina Releases de pe proiectul oficial EasyRSA GitHub, copiați link-ul de descărcare pentru fișierul care se termină în .tgz, apoi lipiți-l în următoarea comandă:

  1. Descărcați cea mai recentă versiune

    $ cd ~
    $ wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.7/EasyRSA-3.0.7.tgz
    
  2. Extrageți tarball-ul

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

3. Creați o ICP pentru serverul OpenVPN#

Înainte de a crea cheia privată și certificatul serverului OpenVPN, trebuie să creați un director local al Infrastructurii de chei publice pe serverul OpenVPN. Veți utiliza acest director pentru a gestiona solicitările de certificate ale serverului și ale clienților, în loc să le faceți direct pe serverul CA.

Pentru a crea un director PKI pe serverul OpenVPN, va trebui să completați un fișier numit vars cu câteva valori implicite.

  1. Creați un fișier vars`

    $ touch ~/easyrsa/vars
    $ cd easyrsa/
    $ editor vars
    
  2. După ce fișierul este deschis, introduceți următoarele două linii

    set_var EASYRSA_ALGO "ec"
    set_var EASYRSA_DIGEST "sha512"
    

    Acestea sunt singurele două linii de care aveți nevoie în acest fișier vars pe serverul OpenVPN, deoarece nu va fi utilizat ca autoritate de certificare. Acestea se vor asigura că cheile private și cererile de certificate sunt configurate pentru a utiliza criptografia cu curbă eliptică (ECC) pentru a genera chei și semnături sigure pentru clienții dvs. și serverul OpenVPN.

    În ceea ce privește alegerea algoritmilor criptografici, eu urmez modelul din acest tutorial, iar voi puteți să le personalizați în funcție de nevoile voastre specifice.

  3. Inițializarea ICP

    După ce ați completat fișierul vars`, puteți trece la crearea directorului PKI. Pentru a face acest lucru, rulați scriptul easyrsa cu opțiunea init-pki:

    $ ./easyrsa init-pki
    

    După ce ați inițializat PKI pe serverul OpenVPN, sunteți gata să treceți la următorul pas, care constă în crearea unei cereri de certificat și a unei chei private pentru serverul OpenVPN.

4. Creați server.req și server.key#

Acum că serverul OpenVPN are toate condițiile prealabile instalate, următorul pas este să generați o pereche de chei compusă dintr-o cheie privată (care trebuie păstrată secretă) și o cerere de semnare a certificatului (.csr) pe serverul OpenVPN.

În termeni generali, pe sistemele în care generăm o cheie și o cerere, aceste fișiere sunt lăsate necriptate prin utilizarea argumentului nopass, deoarece serverele trebuie de obicei să pornească fără introducerea unei parole. Acest lucru generează o cheie necriptată, așa că aveți grijă să protejați cu atenție accesul acesteia și permisiunile de fișier.

Sfat

Note de configurare de la 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. Certificatul serverului trebuie să aibă următoarele caracteristici:

  • keyUsage:  digitalSignature, keyEncipherment`

  • extendedKeyUsage: serverAuth`

  1. Creați cererea de semnare pentru server

    Navigați în directorul ~/easyrsa` de pe serverul OpenVPN ca utilizator non-root și introduceți următoarele comenzi:

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

    Aceasta va crea o cheie privată pentru server și un fișier de cerere de certificat numit server.req`.

    După ce aveți un certificat semnat, îl veți transfera înapoi pe serverul OpenVPN.

  2. Copiați cheia în directorul serverului OpenVPN

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

După finalizarea acestor pași, ați creat cu succes o cheie privată pentru serverul OpenVPN. De asemenea, ați generat o cerere de semnare a certificatului pentru serverul OpenVPN.

Sfat

Extensiile de fișiere pentru cererile de semnare a certificatelor

Extensia de fișier care este adoptată de tutorialul CA și HSM indică crearea unui fișier .csr, însă Easy-RSA creează cereri de semnare a certificatelor cu extensia .req.

Vom folosi interschimbabil ambele extensii, asigurându-ne în același timp că transferăm fișierele corecte către Autoritatea de Certificare și vom genera un certificat final cu extensia .crt.

În următoarea secțiune a acestui ghid, vom semna un fișier .req` cu CA-ul nostru implementat pe dispozitivul HSM 2. În acest scop, voi folosi o mașină dedicată pentru a semna cererile.

5. Semnați și preluați server.crt`#

Următoarele instrucțiuni necesită transferul fișierului server.req (sau server.csr) în sistemul CA.

Transferul în sine nu este sensibil din punct de vedere al securității, deși este înțelept să se verifice dacă fișierul primit se potrivește cu copia expeditorului, în cazul în care transportul nu este de încredere.

Pentru a parcurge acești pași, mă voi baza în mare măsură pe aceste instrucțiuni, pentru a semna cererile de semnare a certificatelor, după ce le-am generat cu Easy-RSA.

  1. Semnați fișierul server.req

    Pe computerul local dedicat accesării HSM, vom utiliza instrumentele furnizate de Opensc 0.20 pentru a semna fișierul .req și a-l trimite înapoi la serverul OpenVPN. Presupunem că am transferat fișierul de pe mașina serverului pe mașina CA.

    În primul rând, începem prin a conecta HSM Nitrokey și introducem această instrucțiune pentru a lista cheile disponibile.

    1. Interogarea listei de dispozitive disponibile

      $ p11tool --list-all
      

      (Pas necesar) Dacă este prima dată când semnați un certificat cu AC, poate doriți să recuperați URI-ul cheii private a AC de la HSM și să îl includeți în fișierul de configurare.

      Notă

      URI-ul cheii trebuie să aibă acest 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. Creați directorul openvpn/` sub certificate-authority/`

      $ mkdir/opt/certificate-authority/
      $ cd /opt/certificate-authority/
      
    3. Semnează `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. Preluarea fișierului server.crt pe calculatorul server

    1. Transferați certificatele semnate pe server

      De pe calculatorul CA, copiați fișierele server.crt și chain.crt pe serverul OpenVPN. În acest exemplu, vom utiliza comanda scp` după cum urmează:

      $ scp openvpn/{server.crt,chain.crt} admin@your_openvpnserver_ip:/tmp
      
    2. Așezați certificatele în directorul serverului

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

      Atenționare

      Certificat CA și chain.crt`

      În cazul de mai sus, CA returnează certificatul sever semnat și include certificatul CA CA.crt, care este fișierul chain.crt. Acest lucru se poate face pe un canal nesigur, deși clientul este încurajat să confirme dacă fișierul chain.crt primit este valid, dacă transportul nu este de încredere.

      Este posibil să redenumiți fișierul chain.crt` în CA.crt pe calculatorul țintă, însă vom folosi `chain.crt în instrucțiunile următoare.

6. Configurați serverul OpenVPN#

O conexiune care utilizează TLS necesită mai multe certificate și chei de autentificare. Acum că le-am emis și semnat, le putem plasa în directoarele potrivite. Defalcarea certificatelor și cheilor care trebuie să se afle în directorul rădăcină sunt următoarele:

OpenVPN server

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

Pe serverul OpenVPN, acum puteți crea fișierul de configurare server.conf cu editorul de text preferat. Fișierul poate fi configurat în funcție de nevoile dvs., în timp ce noi ne asigurăm să schimbăm secțiunile de certificat și cheie de server în funcție de numele pe care le-ați ales pentru fișierele pe care le-am semnat:

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

Iată fișierul de configurare pe care îl putem folosi pentru a testa aceste instrucțiuni:

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

Pentru a testa dacă configurația funcționează corect, putem folosi această comandă:

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

7. Porniți serviciul OpenVPN pe server#

Activați serviciul OpenVPN adăugându-l la systemctl și porniți-l folosind aceste comenzi:

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

Pentru a verifica de două ori dacă serviciul OpenVPN este activ, utilizați această comandă:

$ sudo systemctl status openvpn@server

OpenVPN ar trebui să funcționeze în acest moment.


Configurație pe partea clientului#

1. Instalați OpenVPN și Easy-RSA#

  1. Instalați software-ul

    Putem folosi direct dnf install pentru a instala OpenVPN 2.4.9 și Easy-RSA 3.0.7

    $ sudo dnf install openvpn easy-rsa
    
  2. Apoi creăm ca non-root un director pentru Easy RSA numit Easy-RSA`

    $ mkdir ~/easyrsa
    
  3. Și conectați-l la pachetul Easy RSA pe care tocmai l-am instalat

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

2. Creați o ICP pentru clientul OpenVPN#

În același mod în care am creat o PKI pe serverul OpenVPN, vom crea o PKI folosind Easy-RSA pe partea clientului.

3. Creați un client.req și client.key#

În același mod în care am emis perechea de chei pe server, generăm o pereche de chei pentru client care va fi compusă din fișierul client.req și fișierul client.key. Acesta din urmă trebuie să fie păstrat secret pe calculatorul client.

4. Semnați client.req și emiteți dosarul client.crt`.#

Pentru a transfera fișierul client.req` pe calculatorul CA, vom folosi aceeași metodă ca și în cazul fișierului server.req.

Odată transferat, pe calculatorul CA semnăm fișierul de cerere de semnare a certificatului cu această comandă

$ 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. Importați client.crt` pe Nitrokey de pe mașina CA#

După ce am creat fișierul client.crt, conectăm dispozitivul Nitrokey Pro 2 în mașina CA și importăm fișierul .crt în dispozitivul Pro 2 folosind această comandă:

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

Puteți vedea dacă cheia este efectiv stocată pe Nitrokey folosind această comandă:

$ pkcs15-tool -c

Sau, alternativ

$ pkcs11-tool --list-objects

Pentru mai multe comenzi puteți consulta OpenSC wiki.

6. Recuperați fișierul chain.crt` de pe calculatorul 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. Configurați clientul pentru a interacționa cu Nitrokey#

Acum, pe calculatorul client, vom conecta Nitrokey Pro și îl vom folosi pentru a stabili conexiunea VPN cu serverul. În termeni generali, o conexiune care utilizează TLS necesită mai multe certificate și chei pentru autentificare:

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

Pentru acest ghid, putem utiliza următorul fișier client.conf` și să adăugăm opțiunile necesare în mod corespunzător:

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. Determinați obiectul corect

    Fiecare furnizor PKCS#11 poate suporta mai multe dispozitive. Pentru a vizualiza lista de obiecte disponibile, puteți utiliza următoarea comandă:

    $ 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
    

    Fiecare pereche certificat/cheie privată are un șir unic Serialized id`. Șirul id serializat al certificatului solicitat trebuie specificat, în fișierul de configurare. Putem face acest lucru prin adăugarea opțiunii pkcs11-id` folosind ghilimele simple.

    pkcs11-id 'pkcs11:model=pkcs11:model=PKCS%NNNN%20emulated;token=User%20PIN%20%28OpenPGP%20card%29;manufacturer=ZeitControl;serial=000NNNNNN;id=%03'
    
  2. Adăugați ID-ul serializat recuperat la fișierul de configurare

    Folosind editorul de text preferat, deschideți fișierul server.conf și adăugați următoarele linii, având grijă să introduceți propriile dvs. linii 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'
    

    Pentru setări suplimentare settings legate de autentificarea OpenVPN, puteți adăuga, de asemenea, câteva linii pentru a gestiona gestionarea cheilor, deși acest lucru este opțional.

    Notă

    Faceți clic pentru a vedea codul

    # 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
    

    Etapa opțională

    Dacă aveți nevoie să testați configurația, cu și fără token pe Nitrokey, puteți adăuga linii la același client.conf și să comentați/ne-comentați liniile relevante în funcție de nevoile dumneavoastră:

    Notă

    Faceți clic pentru a vedea codul

    # non_nitrokey login
    
    # cert client.crt
    # key client.key
    # tls-auth ta.key 1
    
  3. Configurați clientul OpenVPN

    Fișierul de configurare final client.conf` ar trebui să arate ca acesta:

    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)

    Pentru a stabili un handshake, trebuie să configurați OpenSSL inclus în 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

    Cu această modificare, nu veți mai avea eroarea semnalată aici, aici și aici.

  5. Probleme cunoscute

    Există unele probleme cunoscute legate de conectarea OpenVPN cu OpenSC. Vă rugăm să consultați aceste probleme ` aici <https://github.com/Nitrokey/wiki/wiki/3rd-Party-Issues>`__.

8. Porniți clientul OpenVPN#

  1. Porniți serviciul OpenVPN pe client

    Activați serviciul OpenVPN și porniți-l folosind aceste comenzi:

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

    Pentru a verifica de două ori dacă serviciul OpenVPN este activ, utilizați această comandă:

    $ sudo systemctl status openvpn-server@server.service
    
  2. Introduceți PIN-ul de utilizator

    Când se execută clientul OpenVPN, trebuie introdus PIN-ul 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: ******
    

    Atenționare

    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)
    

    În unele cazuri raportate, nu se solicită un PIN pe terminal. O soluție ar fi să utilizați această comandă pentru a vă conecta cu PIN-ul:

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

    Alternativ, ați putea recompila clientul OpenVPN cu suportul systemd dezactivat, iar acesta vă va solicita PIN-ul așa cum era de așteptat.

    O altă opțiune ar fi să vă conectați la instanța OpenVPN cu clientul Viscosity, care oferă o experiență de utilizare mai bună, în special pentru introducerea PIN-ului.