OpenVPN-konfiguration med Easy-RSA#

Bemærk

Denne vejledning er under udarbejdelse og vil blive opdateret løbende. Vær venlig at tage hensyn til denne status.

Denne vejledning viser, hvordan du konfigurerer OpenVPN-klienter til at logge ind med en Nitrokey Pro 2 eller en Nitrokey Storage 2. Til software-nøglehåndtering vil vi bruge Easy-RSA, et værktøj, der har udviklet sig sideløbende 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 vil bruge Easy-RSA, fordi det ser ud til at give en vis fleksibilitet og giver mulighed for nøglehåndtering via eksterne PKI’er. Vi vil bruge den på serveren til at sende signeringsanmodningen og gentage den samme proces på klienten. Certificate Signing Requests vil blive signeret af CA’en på Nitorkey HSM’en og videresendt til serveren og klienten.

Forudsætninger#

I den følgende dokumentation har vi brug for 3 forskellige maskiner som følger:

  • OpenVPN-server (v. 2.5) på Debian 10 (virtuel EC2-maskine - AWS)

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

  • Certifikatmyndigheden vil være tilgængelig fra en standalone-maskine med Fedora 30 (lokal maskine)

For at kunne interagere med enhederne skal OpenSC 0.20 være installeret på klienten og CA-maskinen (de lokale maskiner). Du kan følge instruktionerne for at opsætte den i dette link (*Unix).

For at downloade afhængighederne på Fedora-maskiner kan vi bruge denne instruktion:

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

For Debian Linux er nyere OpenSC-pakker tilgængelige ` her <https://github.com/Nitrokey/opensc-build>`_.

Vi vil bruge følgende Nitrokeys til fysisk nøglehåndtering:

Til minde om, at du kan bygge en certifikatudstedende myndighed på Nitrokey HSM 2 ved at følge instruktionerne i dokumentationen ` i <certificate-authority.html#sign-a-server-certificate>`_.

Alternativt kan du oprette din egen CA på en på en separat maskine, eller du kan bruge OpenVPN-vejledningen, som også er baseret på Easy-RSA. De 2 sidste muligheder er afhængige af softwareløsninger til nøglehåndtering.


Server side#

1. Installer OpenVPN#

  1. Først skal vi aktivere IP-forwarding ved at redigere filen /etc/sysctl.conf.

    $ editor /etc/sysctl.conf
    
  2. Fjern eller rediger følgende linje i overensstemmelse hermed

    net.ipv4.ip_forward=1
    
  3. Luk efter at have gemt den, og indtast denne kommando

    $ sysctl -p
    

    Når IP forwarding er udført, skal vi downloade den seneste udgave af OpenvPN til vores Debian 10-server, i henhold til denne vejledning:

  4. Skift til root og hent den GPG-nøgle, der har signeret pakken

    $ sudo -s
    # wget -O - https://swupdate.openvpn.net/repos/repo-public.gpg|apt-key add -
    
  5. Tilføj URL’en for de relevante OpenVPN-pakker til 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 downloadede OpenVPN 2.5, da »password prompt« kræver mindst OpenVPN version 2.4.8 for at logge ind.

  6. Dernæst downloader vi OpenVPN

    $ sudo apt install openvpn
    

    Hvis du ønsker at kontrollere versionen, er det muligt ved at kalde --version og udskrive følgende:

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

For at opbygge PKI’en downloader vi den nyeste version af Easy-RSA til server- og klientmaskinerne. For at hente den seneste version skal du gå til Releases-siden på det officielle EasyRSA GitHub-projekt, kopiere downloadlinket til filen, der slutter med .tgz, og derefter indsætte det i følgende kommando:

  1. Download den seneste version

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

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

3. Opret en PKI til OpenVPN-serveren#

Før du kan oprette din OpenVPN-serverens private nøgle og certifikat, skal du oprette en lokal mappe med en infrastruktur for offentlige nøgler på din OpenVPN-server. Du skal bruge denne mappe til at administrere serverens og klienternes certifikatanmodninger i stedet for at lave dem direkte på din CA-server.

Hvis du vil oprette en PKI-mappe på din OpenVPN-server, skal du udfylde en fil kaldet vars med nogle standardværdier.

  1. Opret en vars-fil

    $ touch ~/easyrsa/vars
    $ cd easyrsa/
    $ editor vars
    
  2. Når filen er åbnet, skal du indsætte følgende to linjer

    set_var EASYRSA_ALGO "ec"
    set_var EASYRSA_DIGEST "sha512"
    

    Det er de eneste to linjer, du har brug for i denne vars-fil på din OpenVPN-server, da den ikke vil blive brugt som en certifikatudstedende myndighed. De vil sikre, at dine private nøgler og certifikatanmodninger er konfigureret til at bruge ECC (Elliptic Curve Cryptography) til at generere nøgler og sikre signaturer for dine klienter og OpenVPN-serveren.

    Med hensyn til valget af kryptografiske algoritmer følger jeg modellen i ` denne vejledning <https://www.digitalocean.com/community/tutorials/how-to-set-up-and-configure-an-openvpn-server-on-centos-8>`_, og du kan tilpasse disse efter dine specifikke behov.

  3. Initialisere PKI’en

    Når du har udfyldt filen vars, kan du fortsætte med at oprette PKI-mappen. For at gøre dette skal du køre easyrsa-scriptet med indstillingen init-pki:

    $ ./easyrsa init-pki
    

    Når du har initialiseret din PKI på OpenVPN-serveren, er du klar til at gå videre til næste trin, som er at oprette en OpenVPN-servercertifikatanmodning og en privat nøgle.

4. Opret server.req og server.key.#

Nu hvor din OpenVPN-server har alle forudsætningerne installeret, er det næste skridt at generere et nøglepar bestående af en privat nøgle (som skal holdes hemmelig) og en Certificate Signing Request (.csr) på din OpenVPN-server.

På systemer, hvor vi genererer en nøgle og en anmodning, efterlades disse filer generelt ukrypteret ved at bruge nopass-argumentet, da servere normalt skal starte op uden indtastning af adgangskode. Dette genererer en u-krypteret nøgle, så husk at beskytte dens adgang og filtilladelser omhyggeligt.

Tip

Konfigurationsnoter fra 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 skal have følgende:

  • keyUsage:  digitalSignature, keyEncipherment

  • extendedKeyUsage: serverAuth

  1. Opret anmodningen om signering for serveren

    Naviger til mappen ~/easyrsa på din OpenVPN-server som din ikke-root-bruger, og indtast følgende kommandoer:

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

    Dette vil oprette en privat nøgle til serveren og en certifikatanmodningsfil kaldet server.req.

    Når du har et underskrevet certifikat, skal du overføre det tilbage til OpenVPN-serveren.

  2. Kopier nøglen til mappen med OpenVPN-serveren

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

Når du har gennemført disse trin, har du oprettet en privat nøgle til din OpenVPN-server. Du har også genereret en Certificate Signing Request for OpenVPN-serveren.

Tip

Filudvidelser for anmodninger om signering af certifikater

Den filudvidelse, der anvendes af CA- og HSM-tutorials, angiver, at der skal oprettes en .csr<x>-fil, men Easy-RSA opretter certifikatunderskrivningsanmodninger med en .req-udvidelse.

Vi vil bruge begge udvidelser i flæng, mens vi sikrer os, at vi overfører de rigtige filer til certifikatudstederen og genererer et endeligt certifikat med en udvidelse .crt.

I det næste afsnit af denne vejledning underskriver vi en .req-fil med vores CA på HSM 2-enheden. Til dette formål vil jeg bruge en dedikeret maskine til at underskrive anmodningerne.

5. Underskriv og hent server.crt#

De følgende instruktioner kræver overførsel af filen server.req (eller server.csr) til CA-systemet.

Selve overførslen er ikke sikkerhedsfølsom, selv om det er klogt at kontrollere, om den modtagne fil svarer til afsenderens kopi, hvis transporten ikke er fortrolig.

For at gennemgå disse trin vil jeg i vid udstrækning benytte denne vejledning til at underskrive certifikatunderskrivningsanmodningerne, når vi har genereret dem med Easy-RSA.

  1. Underskriv filen server.req

    På den lokale maskine, der er dedikeret til at få adgang til HSM, vil vi bruge værktøjerne fra Opensc 0.20 til at signere .req-filen og sende den tilbage til OpenVPN-serveren. Vi antager, at vi har overført filen fra servermaskinen til CA-maskinen.

    Vi starter med at sætte HSM Nitrokey i stikket og indtaster denne instruktion for at få en liste over de tilgængelige nøgler.

    1. Spørg på listen over tilgængelige enheder

      $ p11tool --list-all
      

      (Påkrævet trin) Hvis det er første gang, du underskriver et certifikat med CA’en, kan det være en god idé at hente URI’en til CA’ens private nøgle fra HSM’en og inkludere den i konfigurationsfilen.

      Bemærk

      Nøglens URI skal være i dette 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. Opret openvpn/ mappe under certificate-authority/

      $ mkdir/opt/certificate-authority/
      $ cd /opt/certificate-authority/
      
    3. Underskriv server.req

      $ openssl ca -config sign_server_csrs.ini -engine pkcs11 -keyform engine -days 375 -notext -md sha512 -create_serial -in server.req -out /home/user/pki/issued/server.crt
      
  2. 5.2. Hent filen server.crt til servermaskinen

    1. Overfør de signerede certifikater til serveren

      Kopier filerne server.crt og chain.crt fra CA-maskinen til OpenVPN-serveren. I dette eksempel vil vi bruge kommandoen scp som følger:

      $ scp openvpn/{server.crt,chain.crt} admin@your_openvpnserver_ip:/tmp
      
    2. Placer certifikaterne i serverens mappe

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

      Advarsel

      CA-certifikat og chain.crt

      I ovenstående returnerer CA det signerede sever-certifikat og inkluderer CA-certifikatet CA.crt, som er filen chain.crt. Dette kan ske over en usikker kanal, men klienten opfordres til at bekræfte, om den modtagne chain.crt er gyldig, hvis transporten ikke er betroet.

      Det er muligt at omdøbe filen chain.crt til CA.crt på målmaskinen, men vi vil dog bruge chain.crt i de næste instruktioner.

6. Konfigurer OpenVPN-serveren#

En forbindelse, der bruger TLS, kræver flere certifikater og nøgler til autentificering. Nu hvor vi har udstedt og signeret dem, kan vi placere dem i de rigtige mapper. Fordelingen af de certifikater og nøgler, der skal ligge i rodmappen, er følgende:

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 oprette konfigurationsfilen server.conf med din foretrukne teksteditor. Filen kan konfigureres efter dine behov, mens vi sørger for at ændre servercertifikatet og nøgleafsnittene i overensstemmelse med de navne, du har valgt for de filer, vi har signeret:

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

Her er den konfigurationsfil, som vi kan bruge til at teste disse 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

For at teste, om konfigurationen fungerer korrekt, kan vi bruge denne kommando:

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

7. Start OpenVPN-tjenesten på serveren#

Aktiver OpenVPN-tjenesten ved at tilføje den til systemctl, og start den ved hjælp af disse kommandoer:

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

Brug denne kommando til at dobbelttjekke, om OpenVPN-tjenesten er aktiv:

$ sudo systemctl status openvpn@server

OpenVPN bør køre på dette tidspunkt.


Konfiguration på klientsiden#

1. Installer OpenVPN og Easy-RSA#

  1. Installer softwaren

    Vi kan bruge direkte dnf install til at installere OpenVPN 2.4.9 og Easy-RSA 3.0.7

    $ sudo dnf install openvpn easy-rsa
    
  2. Derefter opretter vi som ikke-rod en mappe til Easy RSA kaldet Easy-RSA

    $ mkdir ~/easyrsa
    
  3. Og knyt den til Easy RSA-pakken, som vi lige har installeret

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

2. Opret en PKI til OpenVPN-klienten#

På samme måde som vi oprettede en PKI på OpenVPN-serveren, vil vi oprette en PKI ved hjælp af Easy-RSA på klientsiden.

3. Opret en client.req og client.key.#

På samme måde som vi udstedte nøgleparret på serveren, genererer vi et nøglepar til klienten, som vil bestå af filen client.req og filen client.key. Sidstnævnte skal holdes hemmelig på klientmaskinen.

4. Underskriv client.req og udsted client.crt-filen.#

For at overføre filen client.req til CA-maskinen bruger vi den samme metode, som vi gjorde for filen server.req.

Når den er overført, underskriver vi certifikatunderskriftsanmodningsfilen på CA-maskinen med denne kommando

$ 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. Importer client.crt på Nitrokey fra CA-maskinen#

Efter at have oprettet filen client.crt tilslutter vi Nitrokey Pro 2-enheden til CA-maskinen og importerer filen .crt til Pro 2-enheden ved hjælp af denne kommando:

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

Du kan se, om nøglen faktisk er gemt på Nitrokey ved hjælp af denne kommando:

$ pkcs15-tool -c

Eller alternativt

$ pkcs11-tool --list-objects

For flere kommandoer kan du se OpenSC-wiki.

6. Hent filen chain.crt fra CA-maskinen#

Mens vi beholder client.crtstored on the nitrokey Pro 2 device, we must retrieve the chain.crt`<x>`-filen klientmaskinen og gemmer den i den rette mappe. Vi kan bruge ``scp som i den metode, der er forklaret i afsnittet om servere i denne vejledning.

7. Konfigurer klienten til at interagere med Nitrokey#

Tilbage på klientmaskinen vil vi nu tilslutte Nitrokey Pro og bruge den til at etablere VPN-forbindelsen med serveren. Generelt set kræver en forbindelse, der anvender TLS, flere certifikater og nøgler til autentificering:

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

I denne vejledning kan vi bruge følgende fil client.conf og tilføje de nødvendige indstillinger til 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. Bestem det korrekte objekt

    Hver PKCS#11-udbyder kan understøtte flere enheder. For at få vist den tilgængelige objektliste kan du bruge følgende 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
    

    Hvert certifikat/privatnøglepar har en unik Serialized id-streng. Den serialiserede id-streng for det ønskede certifikat skal angives i konfigurationsfilen. Det kan vi gøre ved at tilføje indstillingen pkcs11-id ved hjælp af enkelte anførselstegn.

    pkcs11-id 'pkcs11:model=pkcs11:model=PKCS%NNNN%20emulated;token=User%20PIN%20%28OpenPGP%20card%29;manufacturer=ZeitControl;serial=000NNNNNN;id=%03'
    
  2. Tilføj det hentede serialiserede ID til konfigurationsfilen

    Åbn filen server.conf med din foretrukne teksteditor, og tilføj følgende linjer, idet du sørger for at indsætte dine egne 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'
    

    For yderligere indstillinger relateret til OpenVPN-godkendelse, kan du også tilføje nogle få linjer til håndtering af nøglehåndtering, selvom det er valgfrit.

    Bemærk

    Klik for at 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
    

    Valgfrit trin

    Hvis du har brug for at teste konfigurationen med og uden token på Nitrokey, kan du tilføje linjer til den samme client.conf og kommentere/afkommentere de relevante linjer alt efter behov:

    Bemærk

    Klik for at se koden

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

    Den endelige konfigurationsfil client.conf skal se således ud:

    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)

    For at etablere et handshake skal du konfigurere OpenSSL, der er inkluderet i OpenVPN.

    Opret mappen ssl i C:\Program Files\OpenVPN og opret filen openssl.cnf med følgende indhold :

    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 denne ændring vil du ikke have fejl som rapporteret her, her og her.

  5. Kendte problemer

    Der er nogle kendte problemer i forbindelse med OpenVPN-login med OpenSC. Se venligst disse problemer ` her <https://github.com/Nitrokey/wiki/wiki/3rd-Party-Issues>`_.

8. Start OpenVPN-klienten#

  1. Start OpenVPN-tjenesten på klienten

    Aktiver OpenVPN-tjenesten, og start den ved hjælp af disse kommandoer:

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

    Brug denne kommando for at dobbelttjekke, om OpenVPN-tjenesten er aktiv:

    $ sudo systemctl status openvpn-server@server.service
    
  2. Indtast din bruger-PIN-kode

    Når du udfører OpenVPN-klienten, skal du indtaste Nitrokey’s PIN-kode:

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

    Advarsel

    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 nogle rapporterede tilfælde beder den ikke om en PIN-kode på terminalen. En løsning kan være at bruge denne kommando til at logge ind med PIN-koden:

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

    Alternativt kan du genkompilere OpenVPN-klienten med systemd-understøttelse deaktiveret, og den vil bede dig om PIN-koden som forventet.

    En anden mulighed er at logge ind på din OpenVPN-instans med Viscosity-klienten, som giver en bedre brugeroplevelse, især når du skal indtaste PIN-koden.