OpenVPN-konfiguration med Easy-RSA#

Observera

Den här guiden är ett pågående arbete och kommer att uppdateras i takt med att den uppdateras. Vänligen ta hänsyn till denna status.

Den här guiden visar hur du konfigurerar OpenVPN-klienter för att logga in med en Nitrokey Pro 2 eller en Nitrokey Storage 2. För hantering av programvarunycklar kommer vi att använda Easy-RSA, ett verktyg som har utvecklats tillsammans med 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).

Vi kommer att använda Easy-RSA, eftersom det verkar ge viss flexibilitet och tillåter nyckelhantering via externa PKI:er. Vi kommer att använda den på servern för att utfärda signeringsbegäran och upprepa samma process på klienten. Begäran om signering av certifikat kommer att signeras av certifikatutfärdaren på Nitorkey HSM och sändas på nytt till servern och klienten.

Förutsättningar#

I följande dokumentation behöver vi tre olika maskiner enligt följande:

  • OpenVPN-server (v. 2.5) på Debian 10 (virtuell EC2-maskin - AWS)

  • OpenVPN-klient (v. 2.4.9) på Fedora 30 (lokal maskin)

  • Certifikatmyndigheten kommer att vara tillgänglig från en fristående maskin med Fedora 30 (lokal maskin).

För att kunna interagera med enheterna behöver vi OpenSC 0.20 installerat på klienten och CA-maskinen (de lokala maskinerna). Du kan följa instruktionerna för att installera den i den här länken (*Unix).

För att ladda ner beroendena på Fedora-maskiner kan vi använda denna instruktion:

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

För Debian Linux finns nyare OpenSC-paket tillgängliga här.

Vi kommer att använda följande Nitrokeys för fysisk nyckelhantering:

För att bygga en certifikatutfärdare på Nitrokey HSM 2 kan du följa instruktionerna i dokumentationen ` <certificate-authority.html#sign-a-server-certificate>`_.

Alternativt kan du konfigurera din egen certifikatutfärdare på en på en separat maskin, eller använda OpenVPN-tutorialen som också bygger på Easy-RSA. De två sista alternativen bygger på programvarulösningar för nyckelhantering.


Serversidan#

1. Installera OpenVPN#

  1. Först måste vi aktivera IP-forwarding genom att redigera filen /etc/sysctl.conf.

    $ editor /etc/sysctl.conf
    
  2. Ta bort eller ändra följande rad i enlighet med detta

    net.ipv4.ip_forward=1
    
  3. Stäng efter att ha sparat den och ange det här kommandot

    $ sysctl -p
    

    När IP-vidarebefordran är klar måste vi ladda ner den senaste versionen av OpenvPN för vår Debian 10-server, enligt ` dessa instruktioner <https://community.openvpn.net/openvpn/wiki/OpenvpnSoftwareRepos>`__:

  4. Byt till root och hämta GPG-nyckeln som signerade paketet.

    $ sudo -s
    # wget -O - https://swupdate.openvpn.net/repos/repo-public.gpg|apt-key add -
    
  5. Lägg till URL:erna för de lämpliga OpenVPN-paketen i filen sources.list.

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

    Vi laddade ner OpenVPN 2.5 eftersom ”password prompt” kräver minst OpenVPN version 2.4.8 för att logga in.

  6. Därefter laddar vi ner OpenVPN

    $ sudo apt install openvpn
    

    Om du vill kontrollera versionen kan du göra det genom att ringa --version och skriva ut följande:

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

För att bygga upp PKI:n laddar vi ner den senaste versionen av Easy-RSA till server- och klientmaskinerna. För att hämta den senaste versionen går du till sidan Releases på det officiella EasyRSA GitHub-projektet, kopierar nedladdningslänken för filen som slutar på .tgz och klistrar sedan in den i följande kommando:

  1. Ladda ner den senaste versionen

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

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

3. Skapa ett PKI för OpenVPN-servern#

Innan du kan skapa OpenVPN-serverns privata nyckel och certifikat måste du skapa en lokal katalog för Public Key Infrastructure på OpenVPN-servern. Du kommer att använda den här katalogen för att hantera serverens och klienternas certifikatförfrågningar, i stället för att göra dem direkt på din CA-server.

För att skapa en PKI-katalog på din OpenVPN-server måste du fylla en fil som heter vars med några standardvärden.

  1. Skapa en vars-fil

    $ touch ~/easyrsa/vars
    $ cd easyrsa/
    $ editor vars
    
  2. När filen har öppnats, klistrar du in följande två rader

    set_var EASYRSA_ALGO "ec"
    set_var EASYRSA_DIGEST "sha512"
    

    Detta är de enda två raderna som du behöver i den här filen vars på din OpenVPN-server eftersom den inte kommer att användas som certifikatutfärdare. De kommer att se till att dina privata nycklar och certifikatförfrågningar är konfigurerade för att använda ECC (Elliptic Curve Cryptography) för att generera nycklar och säkra signaturer för dina klienter och OpenVPN-servern.

    När det gäller valet av kryptografiska algoritmer följer jag modellen i ` denna handledning <https://www.digitalocean.com/community/tutorials/how-to-set-up-and-configure-an-openvpn-server-on-centos-8>`__, och du kan anpassa dessa efter dina specifika behov.

  3. Initialisera PKI

    När du har fyllt i filen vars kan du fortsätta med att skapa PKI-katalogen. Kör därför easyrsa-skriptet med alternativet init-pki:

    $ ./easyrsa init-pki
    

    När du har initialiserat din PKI på OpenVPN-servern är du redo att gå vidare till nästa steg, som är att skapa en certifikatbegäran och en privat nyckel för OpenVPN-servern.

4. Skapa server.req och server.key.#

Nu när alla förutsättningar är installerade på din OpenVPN-server är nästa steg att generera ett nyckelpar bestående av en privat nyckel (som ska hållas hemlig) och en Certificate Signing Request (.csr) på din OpenVPN-server.

På system där vi genererar en nyckel och en begäran lämnas dessa filer okrypterade genom att använda argumentet nopass, eftersom servrar vanligtvis måste startas utan att något lösenord anges. Detta genererar en okrypterad nyckel, så tänk på att skydda dess åtkomst och filbehörigheter noggrant.

Tips

Konfigurationsanteckningar från 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. Servercertifikatet ska ha följande egenskaper:

  • keyUsage:  digitalSignature, keyEncipherment

  • extendedKeyUsage: serverAuth

  1. Skapa signeringsbegäran för servern

    Navigera till katalogen ~/easyrsa på din OpenVPN-server som icke-rootanvändare och ange följande kommandon:

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

    Detta skapar en privat nyckel för servern och en certifikatförfrågningsfil som heter server.req.

    När du har ett signerat certifikat överför du det tillbaka till OpenVPN-servern.

  2. Kopiera nyckeln till katalogen för OpenVPN-servern

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

När du har slutfört dessa steg har du skapat en privat nyckel för din OpenVPN-server. Du har också genererat en Certificate Signing Request för OpenVPN-servern.

Tips

Filtillägg för begäran om certifikatsignering

Det filtillägg som används av CA och HSM-tutorials anger att en .csr-fil ska skapas, men Easy-RSA skapar certifikatsigneringsförfrågningar med ett .req-tillägg.

Vi kommer att använda båda dessa tillägg, samtidigt som vi ser till att vi överför rätt filer till certifikatutfärdaren och genererar ett slutgiltigt certifikat med ett .crt-tillägg.

I nästa avsnitt av den här guiden kommer vi att signera en .req-fil med vår certifikatutfärdare på HSM 2-enheten. För detta ändamål kommer jag att använda en dedikerad maskin för att signera förfrågningarna.

5. Underteckna och hämta server.crt.#

Följande instruktioner kräver överföring av filen server.req (eller server.csr) till CA-systemet.

Själva överföringen är inte säkerhetskänslig, men det är klokt att kontrollera om den mottagna filen stämmer överens med avsändarens kopia om transporten är opålitlig.

För att gå igenom dessa steg kommer jag att förlita mig på ` dessa instruktioner <certificate-authority.html#creating-the-intermediate-certificate-authority>`_, för att signera certifikatsigneringsbegäran när vi har genererat dem med Easy-RSA.

  1. Skriv under server.req filen

    På den lokala maskinen som är avsedd för åtkomst till HSM kommer vi att använda verktygen i Opensc 0.20 för att signera .req-filen och skicka den tillbaka till OpenVPN-servern. Vi antar att vi har överfört filen från servermaskinen till CA-maskinen.

    Först börjar vi med att sätta in HSM Nitrokey, och skriver in den här instruktionen för att få en lista över tillgängliga nycklar.

    1. Fråga efter listan över tillgängliga enheter

      $ p11tool --list-all
      

      (Obligatoriskt steg) Om det är första gången du signerar ett certifikat med certifikatutfärdaren kanske du vill hämta URI:n för certifikatutfärdarens privata nyckel från HSM och inkludera den i konfigurationsfilen.

      Observera

      Nyckelns URI ska ha detta 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. Skapa en katalog openvpn/ under certificate-authority/.

      $ mkdir/opt/certificate-authority/
      $ cd /opt/certificate-authority/
      
    3. Skriv under 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. Hämta filen server.crt till servermaskinen

    1. Överför de signerade certifikaten till servern

      Kopiera filerna server.crt och chain.crt till OpenVPN-servern från certifikatutfärdaren. I det här exemplet använder vi kommandot scp enligt följande:

      $ scp openvpn/{server.crt,chain.crt} admin@your_openvpnserver_ip:/tmp
      
    2. Placera certifikaten i serverns katalog

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

      Varning

      CA-certifikat och chain.crt

      I ovanstående exempel returnerar certifikatutfärdaren det signerade certifikatet för allvarlig skada och inkluderar certifikatutfärdarens CA.crt som är filen chain.crt. Detta kan göras via en osäker kanal, men klienten uppmanas att bekräfta om den mottagna chain.crt är giltig om transporten är opålitlig.

      Det är möjligt att byta namn på filen chain.crt till CA.crt på målmaskinen, Vi kommer dock att använda chain.crt i nästa instruktion.

6. Konfigurera OpenVPN-servern#

En anslutning som använder TLS kräver flera certifikat och nycklar för autentisering. Nu när vi har utfärdat och signerat dem kan vi placera dem i rätt kataloger. Fördelningen av de certifikat och nycklar som måste finnas i rotkatalogen är följande:

OpenVPN server

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

På din OpenVPN-server kan du nu skapa konfigurationsfilen server.conf med din favorittexteditor. Filen kan konfigureras enligt dina behov, medan vi ser till att ändra sektionerna för servercertifikatet och nyckeln i enlighet med de namn du valt för filerna som vi signerat:

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

Här är konfigurationsfilen som vi kan använda för att testa dessa instruktioner:

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

För att testa om konfigurationen fungerar korrekt kan vi använda det här kommandot:

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

7. Starta OpenVPN-tjänsten på servern#

Aktivera OpenVPN-tjänsten genom att lägga till den i systemctl och starta den med dessa kommandon:

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

Använd det här kommandot för att dubbelkontrollera om OpenVPN-tjänsten är aktiv:

$ sudo systemctl status openvpn@server

OpenVPN bör vara igång vid denna tidpunkt.


Konfiguration på klientsidan#

1. Installera OpenVPN och Easy-RSA#

  1. Installera programvaran

    Vi kan använda direkt dnf install för att installera OpenVPN 2.4.9 och Easy-RSA 3.0.7.

    $ sudo dnf install openvpn easy-rsa
    
  2. Sedan skapar vi en katalog för Easy RSA som heter Easy-RSA.

    $ mkdir ~/easyrsa
    
  3. Länka det till Easy RSA-paketet som vi just installerade

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

2. Skapa en PKI för OpenVPN-klienten#

På samma sätt som vi skapade ett PKI på OpenVPN-servern kommer vi att skapa ett PKI med Easy-RSA på klientsidan.

3. Skapa en client.req och client.key.#

På samma sätt som vi utfärdade nyckelparet på servern genererar vi ett nyckelpar för klienten som kommer att bestå av filen client.req och filen client.key. Den sistnämnda måste hållas hemlig på klientmaskinen.

4. Signera client.req och utfärda client.crt-filen.#

För att överföra filen client.req till CA-maskinen använder vi samma metod som för filen server.req.

Efter överföringen signerar vi filen med begäran om certifikatsignering på CA-maskinen med det här kommandot

$ 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. Importera client.crt på Nitrokey från CA-maskinen.#

Efter att ha skapat filen client.crt ansluter vi Nitrokey Pro 2-enheten till CA-maskinen och importerar filen .crt till Pro 2-enheten med det här kommandot:

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

Du kan se om nyckeln verkligen är lagrad på Nitrokey med det här kommandot:

$ pkcs15-tool -c

Eller alternativt

$ pkcs11-tool --list-objects

För fler kommandon kan du läsa OpenSC-wikin.

6. Hämta chain.crt-filen från CA-maskinen.#

Medan vi behåller client.crtstored on the nitrokey Pro 2 device, we must retrieve the chain.crt-filen på klientmaskinen och lagrar den i den lämpliga katalogen. Vi kan använda scp på samma sätt som i den metod som förklaras i avsnittet om servrar i den här guiden.

7. Konfigurera klienten så att den kan interagera med Nitrokey#

På klientmaskinen kopplar vi in Nitrokey Pro och använder den för att upprätta en VPN-anslutning med servern. Generellt sett kräver en anslutning som använder TLS flera certifikat och nycklar för autentisering:

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

För den här guiden kan vi använda följande client.conf-fil och lägga till de nödvändiga alternativen i den:

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. Bestäm rätt objekt

    Varje PKCS#11-leverantör kan stödja flera enheter. För att visa listan över tillgängliga objekt kan du använda följande kommando:

    $ 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
    

    Varje certifikat/privatnyckelpar har en unik Serialized id-sträng. Den serialiserade id-strängen för det begärda certifikatet ska anges i konfigurationsfilen. Vi kan göra detta genom att lägga till alternativet pkcs11-id med enkla citattecken.

    pkcs11-id 'pkcs11:model=pkcs11:model=PKCS%NNNN%20emulated;token=User%20PIN%20%28OpenPGP%20card%29;manufacturer=ZeitControl;serial=000NNNNNN;id=%03'
    
  2. Lägg till det serialiserade ID som hämtas i konfigurationsfilen.

    Öppna filen server.conf med hjälp av din favorittextredigerare och lägg till följande rader, men var noga med att infoga dina egna 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'
    

    För ytterligare inställningar relaterade till OpenVPN-autentisering kan du också lägga till några rader för att hantera nyckelhantering, även om det är frivilligt.

    Observera

    Klicka för att se koden

    # 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
    

    Frivilligt steg

    Om du behöver testa konfigurationen, med och utan token på Nitrokey, kan du lägga till rader i samma client.conf och kommentera/avkommentera de relevanta raderna enligt dina behov:

    Observera

    Klicka för att se koden

    # non_nitrokey login
    
    # cert client.crt
    # key client.key
    # tls-auth ta.key 1
    
  3. Konfigurera OpenVPN-klienten

    Den slutliga konfigurationsfilen client.conf bör se ut så här:

    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)

    För att kunna upprätta en handskakning måste du konfigurera OpenSSL som ingår i OpenVPN.

    Skapa katalogen ssl i C:\Program Files\OpenVPN och skapa filen openssl.cnf med följande innehåll :

    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

    Med denna ändring kommer du inte att få fel som rapporterats här, här och här

  5. Kända problem

    Det finns några kända problem med OpenVPN-inloggning med OpenSC. Se dessa problem här.

8. Starta OpenVPN-klienten#

  1. Starta OpenVPN-tjänsten på klienten

    Aktivera OpenVPN-tjänsten och starta den med dessa kommandon:

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

    Använd det här kommandot för att dubbelkolla om OpenVPN-tjänsten är aktiv:

    $ sudo systemctl status openvpn-server@server.service
    
  2. Ange din användar-PIN

    När du kör OpenVPN-klienten måste du ange Nitrokeys PIN-kod:

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

    Varning

    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)
    

    I vissa rapporterade fall begärs ingen PIN-kod på terminalen. En lösning är att använda detta kommando för att logga in med PIN-koden:

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

    Alternativt kan du kompilera OpenVPN-klienten på nytt med inaktiverat systemd-stöd, och den kommer att be dig om PIN-koden som förväntat.

    Ett annat alternativ är att logga in på din OpenVPN-instans med Viscosity-klienten, som ger en bättre användarupplevelse, särskilt när det gäller att ange PIN-koden.