Konfiguracija OpenVPN z Easy-RSA#

(Nitrokey Pro 2 - Windows)

Opomba

Ta vodnik je v nastajanju in bo sproti posodabljan. Upoštevajte to stanje.

Ta vodnik prikazuje, kako konfigurirati odjemalce OpenVPN za prijavo z uporabo Nitrokey Pro 2 ali Nitrokey Storage 2. Za upravljanje programskih ključev bomo uporabljali Easy-RSA, pripomoček, ki se je razvijal skupaj z OpenVPN.

Za podpisovanje potrdil bomo uporabili Nitrokey HSM 2, nastavljen kot Certificate Authority, vendar ta vodnik ne zajema nastavitve samega overitelja (ta je jasna in dobro dokumentirana tukaj).

Uporabili bomo Easy-RSA, ker se zdi, da zagotavlja določeno prilagodljivost in omogoča upravljanje ključev prek zunanjih PKI. Uporabili ga bomo v strežniku za izdajo zahteve za podpisovanje in enak postopek ponovili v odjemalcu. Zahteve za podpis potrdila bo podpisal CA v Nitorkeyjevem HSM ter jih ponovno poslal strežniku in odjemalcu.

Predpogoji#

V naslednji dokumentaciji bomo potrebovali 3 različne stroje, kot sledi:

  • Strežnik OpenVPN (v. 2.5) na sistemu Debian 10 (virtualni stroj EC2 - AWS)

  • Odjemalec OpenVPN (v. 2.4.9) v operacijskem sistemu Fedora 30 (lokalni računalnik)

  • Overitelj bo dostopen iz samostojnega računalnika z operacijskim sistemom Fedora 30 (lokalni računalnik).

Za interakcijo z napravami potrebujemo OpenSC 0.20, nameščen v odjemalcu in računalniku CA (lokalni računalniki). Za namestitev lahko sledite navodilom na tehni povezavi (*Unix).

Za prenos odvisnosti na napravah Fedora lahko uporabimo to navodilo:

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

Za Debian Linux so na voljo novejši paketi OpenSC tudi.

Za upravljanje fizičnih ključev bomo uporabili naslednje Nitrokeys:

Če želite zgraditi overitelja potrdil v sistemu Nitrokey HSM 2, sledite navodilom, ki so na voljo v dokumentaciji.

Lahko pa nastavite svoj CA v na ločenem računalniku ali uporabite vadnico OpenVPN, ki se prav tako zanaša na Easy-RSA. Zadnji dve možnosti se zanašata na programske rešitve za upravljanje ključev.


Na strani strežnika#

1. Namestite OpenVPN#

  1. Najprej moramo omogočiti posredovanje IP z urejanjem datoteke /etc/sysctl.conf

$ editor /etc/sysctl.conf
  1. Spustite komentar ali ustrezno uredite naslednjo vrstico

net.ipv4.ip_forward=1
  1. Po shranjevanju ga zaprite in vnesite ta ukaz

$ sysctl -p

Ko bo posredovanje IP opravljeno, bomo morali prenesti najnovejšo izdajo OpenvPN za naš strežnik Debian 10 v skladu s temi navodili:

  1. Spremenite se v root in prenesite ključ GPG, ki je podpisal paket

$ sudo -s
# wget -O - https://swupdate.openvpn.net/repos/repo-public.gpg|apt-key add -
  1. V datoteko sources.list dodajte URL ustreznih paketov OpenVPN

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

Prenesli smo OpenVPN 2.5, saj „poziv za geslo“ za prijavo zahteva vsaj OpenVPN različico 2.4.8.

  1. Nato prenesemo OpenVPN

$ sudo apt install openvpn

Če želite preveriti različico, lahko to storite tako, da pokličete --version in izpišete naslednje:

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

Za izgradnjo PKI bomo na strežnik in odjemalske računalnike prenesli najnovejšo različico Easy-RSA. Najnovejšo različico dobite tako, da obiščete stran Releases na uradnem projektu EasyRSA GitHub, kopirate povezavo za prenos datoteke, ki se konča z .tgz, in jo nato prilepite v naslednji ukaz:

  1. Prenesite najnovejšo različico

$ cd ~
wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.7/EasyRSA-3.0.7.tgz
  1. Izvleček paketa tarball

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

3. Ustvarite PKI za strežnik OpenVPN#

Preden lahko ustvarite zasebni ključ in potrdilo strežnika OpenVPN, morate v strežniku OpenVPN ustvariti lokalni imenik infrastrukture javnih ključev. Ta imenik boste uporabljali za upravljanje zahtevkov za potrdila strežnika in odjemalcev, namesto da bi jih neposredno pošiljali v strežnik CA.

Če želite ustvariti imenik PKI v strežniku OpenVPN, morate datoteko z imenom vars napolniti z nekaj privzetimi vrednostmi.

  1. Ustvarite datoteko vars

$ touch ~/easyrsa/vars
$ cd easyrsa/
$ editor vars
  1. Ko je datoteka odprta, prilepite naslednji dve vrstici

set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"

To sta edini dve vrstici, ki ju potrebujete v tej vars datoteki v strežniku OpenVPN, saj se ne bo uporabljala kot overitelj potrdil. Zagotovili bodo, da bodo vaši zasebni ključi in zahteve za potrdila konfigurirani tako, da bodo uporabljali kriptografijo eliptičnih krivulj (ECC) za generiranje ključev in varnih podpisov za vaše odjemalce in strežnik OpenVPN.

Glede izbire kriptografskih algoritmov upoštevam model iz toga priročnika, lahko pa jih prilagodite glede na svoje posebne potrebe.

  1. Inicializacija infrastrukture PKI

Ko izpolnite datoteko vars, lahko nadaljujete z ustvarjanjem imenika PKI. To storite tako, da zaženete skripto easyrsa z možnostjo init-pki:

$ ./easyrsa init-pki

Ko ste v strežniku OpenVPN inicializirali PKI, lahko preidete na naslednji korak, to je ustvarjanje zahteve za potrdilo strežnika OpenVPN in zasebnega ključa.

4. Ustvarite server.req in server.key#

Zdaj, ko so v strežniku OpenVPN nameščeni vsi predpogoji, je naslednji korak ustvarjanje para ključev, ki ga sestavljata zasebni ključ (ki naj ostane skrivnost) in zahteva za podpis potrdila (.csr) v strežniku OpenVPN.

Na splošno v sistemih, kjer generiramo ključ in zahtevo, te datoteke ostanejo nešifrirane z uporabo argumenta nopass, saj se morajo strežniki običajno zagnati brez vnosa gesla. Tako se ustvari nešifriran ključ, zato skrbno zaščitite njegov dostop in dovoljenja za datoteke.

Nasvet

Opombe o konfiguraciji iz OpenVPN:

  1. Strežnik in vsak odjemalec morata imeti svojo datoteko s potrdilom in ključem. Strežnik in vsi odjemalci bodo uporabljali isto datoteko CA.

  2. Strežniško potrdilo mora vsebovati naslednje podatke:

  • keyUsage:  digitalSignature, keyEncipherment

  • extendedKeyUsage: serverAuth

  1. Ustvarite zahtevo za podpisovanje za strežnik

Kot uporabnik brez korena pojdite v imenik ~/easyrsa v strežniku OpenVPN in vnesite naslednje ukaze:

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

To bo ustvarilo zasebni ključ za strežnik in datoteko z zahtevo za potrdilo z imenom server.req.

Ko imate podpisano potrdilo, ga prenesite nazaj v strežnik OpenVPN.

  1. Kopiranje ključa v imenik strežnika OpenVPN

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

Po opravljenih korakih ste uspešno ustvarili zasebni ključ za strežnik OpenVPN. Ustvarili ste tudi zahtevo za podpis potrdila za strežnik OpenVPN.

Nasvet

Razširitve datotek za zahteve za podpisovanje potrdil

Razširitev datoteke, ki jo prevzameta CA in HSM tutorial, označuje ustvarjanje datoteke .csr, vendar Easy-RSA ustvarja zahteve za podpisovanje potrdil z razširitvijo .req.

Obe razširitvi bomo uporabljali izmenično, pri čemer bomo poskrbeli, da bomo organu za potrjevanje prenesli prave datoteke in ustvarili končno potrdilo z razširitvijo .crt.

V naslednjem razdelku tega vodnika bomo podpisali datoteko .req z našim CA, nameščenim v napravi HSM 2. V ta namen bom za podpisovanje zahtevkov uporabil namensko napravo.

5. Podpis in prevzem server.crt#

Naslednja navodila zahtevajo prenos datoteke server.req (ali server.csr) v sistem CA.

Sam prenos ni varnostno občutljiv, čeprav je pametno preveriti, ali se prejeta datoteka ujema s pošiljateljevo kopijo, če prenos ni zaupanja vreden.

Pri izvajanju teh korakov se bom v veliki meri oprl na te navodila za podpisovanje zahtevkov za podpis potrdil, ko smo jih ustvarili z Easy-RSA.

5.1. Podpisovanje datoteke server.req#

V lokalnem računalniku, namenjenem za dostop do HSM, bomo uporabili orodja, ki jih zagotavlja Opensc 0.20, za podpisovanje datoteke .req in jo poslali nazaj v strežnik OpenVPN. Predpostavljamo, da smo datoteko prenesli iz strežnikovega računalnika v računalnik CA.

Najprej začnemo s priključitvijo ključa HSM Nitrokey in vnesemo to navodilo za seznam tipk, ki so na voljo.

  1. Poizvedba po seznamu razpoložljivih naprav

  $ 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 ključa mora biti v tej obliki:

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. Ustvarite openvpn/ imenik pod certificate-authority/

$ mkdir/opt/certificate-authority/
$ cd /opt/certificate-authority/
  1. Podpisati 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. Pridobitev datoteke server.crt v strežniški stroj#

  1. Prenos podpisanih potrdil v strežnik

Iz računalnika CA kopirajte datoteke server.crt in chain.crt v strežnik OpenVPN. V tem primeru bomo uporabili ukaz scp, kot sledi:

$ scp openvpn/{server.crt,chain.crt} admin@your_openvpnserver_ip:/tmp
  1. Potrdila namestite v imenik strežnika

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

Opozorilo

Potrdilo CA in chain.crt

V zgornjem primeru CA vrne podpisano potrdilo sever in vključuje potrdilo CA CA.crt, ki je chain.crt. To je mogoče storiti prek nezanesljivega kanala, čeprav se odjemalcu priporoča, da potrdi, ali je prejeti chain.crt veljaven, če prenos ni zaupanja vreden.

Datoteko chain.crt je mogoče preimenovati v CA.crt v ciljnem računalniku, vendar bomo v naslednjih navodilih uporabili chain.crt.

6. Konfiguracija strežnika OpenVPN#

Povezava, ki uporablja TLS, zahteva več certifikatov in ključev za preverjanje pristnosti. Zdaj, ko smo jih izdali in podpisali, jih lahko namestimo v prave imenike. Razdelitev potrdil in ključev, ki se morajo nahajati v korenskem imeniku, je naslednja:

OpenVPN server

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

V strežniku OpenVPN lahko zdaj ustvarite konfiguracijsko datoteko server.conf z najljubšim urejevalnikom besedila. Datoteko lahko konfigurirate v skladu s svojimi potrebami, mi pa poskrbimo, da spremenimo dele certifikata in ključa strežnika v skladu z imeni, ki ste jih izbrali za vaše datoteke, ki smo jih podpisali:

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

Tukaj je konfiguracijska datoteka, ki jo lahko uporabimo za testiranje teh navodil:

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

Če želimo preveriti, ali konfiguracija deluje pravilno, lahko uporabimo ta ukaz:

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

7. Zagon storitve OpenVPN v strežniku#

Omogočite storitev OpenVPN tako, da jo dodate v systemctl, in jo zaženite s temi ukazi:

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

Za dvojno preverjanje, ali je storitev OpenVPN aktivna, uporabite ta ukaz:

$ sudo systemctl status openvpn@server

Na tej točki mora delovati OpenVPN.


Konfiguracija na strani odjemalca#

1. Install OpenVPN and Easy-RSA
2. Create a Public Key Infrastructure (PKI) for the OpenVPN client
3. Create the client's certificate signing request and the client's key
4. Sign and issue the client's certificate
5. Import the client certificate on the Nitrokey from the CA machine
6. Retrieve the chain certificate from the CA machine
7. Configure the client to interact with the Nitrokey
8. Start the OpenVPN client

1. Namestitev OpenVPN in Easy-RSA#

  1. Namestitev programske opreme

Za namestitev OpenVPN 2.4.9 in Easy-RSA 3.0.7 lahko neposredno uporabimo dnf install

$ sudo dnf install openvpn easy-rsa
  1. Nato ustvarimo imenik za Easy RSA z imenom Easy-RSA

$ mkdir ~/easyrsa
  1. in ga povežite s paketom Easy RSA, ki smo ga pravkar namestili

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

2. Ustvarite PKI za odjemalca OpenVPN#

Na enak način, kot smo ustvarili PKI v strežniku OpenVPN, bomo ustvarili PKI z uporabo Easy-RSA na strani odjemalca.

3. Ustvarite client.req in client.key#

Na enak način, kot smo izdali par ključev v strežniku, ustvarimo par ključev za odjemalca, ki bo sestavljen iz datoteke client.req in datoteke client.key. Slednja mora biti v odjemalčevem računalniku tajna.

4. Podpisati client.req in izdati client.crt datoteko#

Za prenos datoteke client.req v računalnik CA bomo uporabili enako metodo kot za datoteko server.req.

Po prenosu na računalniku CA podpišemo datoteko z zahtevo za podpis potrdila s tem ukazom

$ 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. Uvoz client.crt na Nitrokey iz naprave CA#

Po ustvarjanju datoteke client.crt priključimo napravo Nitrokey Pro 2 v računalnik CA in uvozimo .crt v napravo Pro 2 s tem ukazom:

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

S tem ukazom lahko preverite, ali je ključ učinkovito shranjen v napravi Nitrokey:

$ pkcs15-tool -c

Ali pa

$ pkcs11-tool --list-objects

Za več ukazov si lahko ogledate OpenSC wiki.

6. Pridobite datoteko chain.crt z računalnika CA#

Medtem ko client.crtstored on the nitrokey Pro 2 device, we must retrieve the chain.crt datoteko hranimo v odjemalskem računalniku in v ustreznem imeniku. Uporabimo lahko scp kot pri metodi, razloženi v strežniškem delu tega vodnika.

7. Konfigurirajte odjemalca za interakcijo z napravo Nitrokey#

Zdaj bomo v odjemalskem računalniku priključili ključ Nitrokey Pro in z njim vzpostavili povezavo VPN s strežnikom. Na splošno velja, da povezava, ki uporablja protokol TLS, zahteva več potrdil in ključev za preverjanje pristnosti:

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

Za ta vodnik lahko uporabimo naslednjo datoteko client.conf in ji ustrezno dodamo zahtevane 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. Določite pravilen predmet

Vsak ponudnik PKCS#11 lahko podpira več naprav. Za ogled seznama razpoložljivih predmetov lahko uporabite naslednji ukaz:

$ 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

Vsak par potrdilo/zasebni ključ ima edinstven Serialized id niz. V konfiguracijski datoteki je treba navesti serializiran niz id zahtevanega potrdila. To lahko storimo tako, da dodamo možnost pkcs11-id z uporabo enojnih narekovajev.

pkcs11-id 'pkcs11:model=pkcs11:model=PKCS%NNNN%20emulated;token=User%20PIN%20%28OpenPGP%20card%29;manufacturer=ZeitControl;serial=000NNNNNN;id=%03'
  1. Dodajanje pridobljenega serializiranega ID v konfiguracijsko datoteko

Z najljubšim urejevalnikom besedila odprite datoteko server.conf in dodajte naslednje vrstice, pri čemer pazite, da vstavite svoje 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'

Za dodatne nastavitve, povezane z avtentikacijo OpenVPN, lahko dodate tudi nekaj vrstic za upravljanje ključev, čeprav to ni obvezno.

Opomba

Kliknite za ogled kode

# 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

Izbirni korak

Če želite preizkusiti konfiguracijo z žetonom na ključu Nitrokey in brez njega, lahko dodate vrstice v isti client.conf in po potrebi komentirate/odkomentirate ustrezne vrstice:

Opomba

Kliknite za ogled kode

# non_nitrokey login

# cert client.crt
# key client.key
# tls-auth ta.key 1
  1. Konfiguracija odjemalca OpenVPN

Končna konfiguracijska datoteka client.conf mora biti videti kot ta:

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. Znane težave

Obstaja nekaj znanih težav, povezanih s prijavo v OpenVPN z OpenSC. Te težave si oglejte tudi.

8. Zagon odjemalca OpenVPN#

  1. Zagon storitve OpenVPN v odjemalcu

Omogočite storitev OpenVPN in jo zaženite s temi ukazi:

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

Če želite dvakrat preveriti, ali je storitev OpenVPN aktivna, uporabite ta ukaz:

$ sudo systemctl status openvpn-server@server.service
  1. Vnesite uporabniško kodo PIN

Pri izvajanju odjemalca OpenVPN je treba vnesti kodo PIN 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: ******

Opozorilo

Unfortunately OpenVPN doesn’t seem to be able to establish a handshake 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 nekaterih primerih, o katerih so poročali, terminal ne zahteva vnosa kode PIN. To bi se dalo zaobiti tako, da bi se s tem ukazom prijavili s kodo PIN:

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

Lahko pa ` ponovno sestavite odjemalca OpenVPN <https://forums.openvpn.net/viewtopic.php?f=4&t=23318>`_ z onemogočeno podporo systemd, ki vas bo po pričakovanjih pozval k vnosu kode PIN.

Druga možnost je, da se v svoj primerek OpenVPN prijavite z odjemalcem Viscosity, ki zagotavlja boljšo uporabniško izkušnjo, zlasti pri vnosu kode PIN.