Konfiguracja OpenVPN z Easy-RSA#

(Nitrokey Pro 2 - Linux)

Informacja

Ten przewodnik jest w trakcie tworzenia i będzie aktualizowany na bieżąco. Proszę wziąć ten status pod uwagę.

Ten przewodnik pokazuje, jak skonfigurować klientów OpenVPN do logowania przy użyciu klucza Nitrokey Pro 2 lub Nitrokey Storage 2. Do programowego zarządzania kluczami będziemy używać Easy-RSA, narzędzia, które rozwijało się wraz z OpenVPN.

Do podpisania certyfikatów użyjemy modułu Nitrokey HSM 2 skonfigurowanego jako Urząd certyfikacji, jednak niniejszy przewodnik nie obejmuje konfiguracji samego urzędu certyfikacji (jest ona jasno i dobrze udokumentowana tutaj).

Użyjemy Easy-RSA, ponieważ wydaje się zapewniać pewną elastyczność i pozwala na zarządzanie kluczami przez zewnętrzne PKI. Użyjemy go na serwerze, aby wystawić żądanie podpisania certyfikatu i powtórzymy ten sam proces na kliencie. Żądania podpisania certyfikatu zostaną podpisane przez CA na HSM Nitorkey, i ponownie przesłane do serwera i klienta.

Wymagania wstępne#

W poniższej dokumentacji będziemy potrzebować 3 różnych maszyn, jak poniżej:

  • Serwer OpenVPN (v. 2.5) na Debianie 10 (maszyna wirtualna EC2 - AWS)

  • Klient OpenVPN (v. 2.4.9) na Fedorze 30 (maszyna lokalna)

  • Urząd certyfikacji będzie dostępny z wolnostojącej maszyny z Fedorą 30 (maszyna lokalna).

Do interakcji z urządzeniami będziemy potrzebowali OpenSC 0.20 zainstalowanego na kliencie i maszynie CA (maszyny lokalne). Możesz postępować zgodnie z instrukcjami, aby go skonfigurować w tym odnośniku (*Unix).

Aby pobrać zależności na maszyny Fedora możemy skorzystać z tej instrukcji:

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

Dla systemu Debian Linux, nowsze pakiety OpenSC są dostępne tutaj.

Do fizycznego zarządzania kluczami będziemy używać następujących Nitrokeys:

Dla przypomnienia, aby zbudować Urząd Certyfikacji na Nitrokey HSM 2, możesz postępować zgodnie z instrukcjami dostępnymi ` w dokumentacji <certificate-authority.html#sign-a-server-certificate>`_.

Alternatywnie można skonfigurować własny CA na oddzielnym komputerze lub skorzystać z samouczka OpenVPN, który również opiera się na Easy-RSA. Dwie ostatnie opcje opierają się na rozwiązaniach programowych do zarządzania kluczami.


Po stronie serwera#

1. Zainstaluj OpenVPN#

  1. Najpierw musimy włączyć funkcję IP Forwarding poprzez edycję pliku /etc/sysctl.conf.

$ editor /etc/sysctl.conf
  1. Usunąć lub odpowiednio edytować następującą linię

net.ipv4.ip_forward=1
  1. Zamknij po zapisaniu i wprowadź następujące polecenie

$ sysctl -p

Po wykonaniu przekierowania IP, będziemy musieli pobrać najnowszą wersję OpenvPN dla naszego serwera Debian 10, zgodnie z tymi instrukcjami:

  1. Zmień nazwę na root i pobierz klucz GPG, który podpisał pakiet

$ sudo -s
# wget -O - https://swupdate.openvpn.net/repos/repo-public.gpg|apt-key add -
  1. Dodaj adresy URL odpowiednich pakietów OpenVPN do pliku sources.list.

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

Pobraliśmy OpenVPN 2.5, ponieważ „password prompt” wymaga co najmniej OpenVPN wersji 2.4.8 do zalogowania się.

  1. Następnie pobieramy OpenVPN

$ sudo apt install openvpn

Jeśli chcesz sprawdzić wersję, można to zrobić wywołując --version i wypisać co następuje:

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

Aby zbudować PKI, pobierzemy najnowszą wersję Easy-RSA na serwer i komputery klienckie. Aby uzyskać najnowsze wydanie, przejdź na stronę Releases na oficjalnym projekcie EasyRSA GitHub, skopiuj link do pobrania pliku kończącego się na .tgz, a następnie wklej go do następującego polecenia:

  1. Pobierz najnowszą wersję

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

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

3. Utwórz PKI dla serwera OpenVPN#

Przed utworzeniem klucza prywatnego i certyfikatu dla serwera OpenVPN należy utworzyć lokalny katalog Public Key Infrastructure na serwerze OpenVPN. Katalog ten będzie wykorzystywany do zarządzania żądaniami certyfikatów dla serwera i klientów, zamiast zgłaszania ich bezpośrednio na serwerze CA.

Aby zbudować katalog PKI na serwerze OpenVPN, będziesz musiał wypełnić plik o nazwie vars pewnymi domyślnymi wartościami.

  1. Utwórz plik vars.

$ touch ~/easyrsa/vars
$ cd easyrsa/
$ editor vars
  1. Po otwarciu pliku, wklej następujące dwie linie

set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"

Są to jedyne dwie linie, których potrzebujesz w tym pliku vars na swoim serwerze OpenVPN, ponieważ nie będzie on używany jako Urząd Certyfikacji. Zapewnią one, że Twoje klucze prywatne i żądania certyfikatów są skonfigurowane tak, aby używać Elliptic Curve Cryptography (ECC) do generowania kluczy i bezpiecznych podpisów dla Twoich klientów i serwera OpenVPN.

Jeśli chodzi o wybór algorytmów kryptograficznych, ja korzystam z modelu przedstawionego w tym poradniku, a Ty możesz je dostosować do swoich potrzeb.

  1. Inicjalizacja PKI

Po wypełnieniu pliku vars można przystąpić do tworzenia katalogu PKI. Aby to zrobić, należy uruchomić skrypt easyrsa z opcją init-pki:

$ ./easyrsa init-pki

Po zainicjalizowaniu PKI na serwerze OpenVPN, możesz przejść do kolejnego kroku, którym jest utworzenie żądania certyfikatu serwera OpenVPN oraz klucza prywatnego.

4. Utwórz server.req i server.key.#

Teraz, gdy Twój serwer OpenVPN ma już zainstalowane wszystkie wymagania wstępne, następnym krokiem jest wygenerowanie pary kluczy składającej się z klucza prywatnego (do utrzymania w tajemnicy), oraz Certificate Signing Request (.csr) na Twoim serwerze OpenVPN.

Ogólnie rzecz biorąc, w systemach, w których generujemy klucz i żądanie, pliki te pozostawiamy niezaszyfrowane, używając argumentu nopass, ponieważ serwery zazwyczaj muszą się uruchamiać bez podawania hasła. Generuje to niezaszyfrowany klucz, więc należy pamiętać o ochronie dostępu do niego i uprawnień do plików.

Wskazówka

Notatki konfiguracyjne z OpenVPN:

  1. Serwer i każdy klient musi mieć swój własny plik cert i key. Serwer i wszyscy klienci będą używać tego samego pliku CA.

  2. Certyfikat serwera powinien posiadać następujące cechy:

  • keyUsage:  digitalSignature, keyEncipherment

  • extendedKeyUsage: serverAuth

  1. Tworzenie żądania podpisania dla serwera

Przejdź do katalogu ~/easyrsa na serwerze OpenVPN jako użytkownik nieroot, i wprowadź następujące polecenia:

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

Spowoduje to utworzenie klucza prywatnego dla serwera i pliku żądania certyfikatu o nazwie server.req.

Po uzyskaniu podpisanego certyfikatu, należy go przesłać z powrotem na serwer OpenVPN.

  1. Skopiuj klucz do katalogu serwera OpenVPN

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

Po wykonaniu tych kroków, udało Ci się utworzyć klucz prywatny dla Twojego serwera OpenVPN. Wygenerowany został również certyfikat Certificate Signing Request dla serwera OpenVPN.

Wskazówka

Rozszerzenia plików dla wniosków o podpisanie certyfikatu

Rozszerzenie pliku przyjęte przez samouczek CA i HSM wskazuje na tworzenie pliku .csr, jednak Easy-RSA tworzy żądania podpisania certyfikatu z rozszerzeniem .req.

Będziemy używać zamiennie obu rozszerzeń, jednocześnie upewniając się, że przekazujemy odpowiednie pliki do Urzędu Certyfikacji i generujemy końcowy certyfikat z rozszerzeniem .crt.

W następnej części poradnika podpiszemy plik .req z naszym CA wdrożonym na urządzeniu HSM 2. W tym celu, użyję dedykowanej maszyny do podpisywania żądań.

5. Podpisz i odbierz server.crt.#

Poniższe instrukcje wymagają przeniesienia pliku server.req (lub server.csr) do systemu CA.

Sam transfer nie jest wrażliwy na bezpieczeństwo, choć dobrze jest sprawdzić, czy otrzymany plik odpowiada kopii nadawcy, jeśli transport jest niezaufany.

Aby przejść przez te kroki, będę w dużej mierze opierał się na tych instrukcjach, aby podpisać żądania podpisania certyfikatu po wygenerowaniu ich za pomocą Easy-RSA.

5.1. Podpisz plik server.req.#

Na maszynie lokalnej przeznaczonej do dostępu do HSM, wykorzystamy narzędzia dostarczone przez Opensc 0.20 w celu podpisania pliku .req i odesłania go do serwera OpenVPN. Zakładamy, że plik został przesłany z serwera na maszynę CA.

Najpierw zaczynamy od podłączenia HSM Nitrokey, i wpisania tej instrukcji do listy dostępnych klawiszy.

  1. Zapytanie o listę dostępnych urządzeń

  $ 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 klucza powinien być w tym formacie:

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. Utwórz katalog openvpn/ pod certificate-authority/.

$ mkdir/opt/certificate-authority/
$ cd /opt/certificate-authority/
  1. Podpisać 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. Pobrać plik server.crt na maszynę serwera#

  1. Prześlij podpisane certyfikaty na serwer

Z maszyny CA skopiuj pliki server.crt i chain.crt na serwer OpenVPN. W tym przykładzie użyjemy polecenia scp jak poniżej:

$ scp openvpn/{server.crt,chain.crt} admin@your_openvpnserver_ip:/tmp
  1. Umieść certyfikaty w katalogu serwera

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

Ostrzeżenie

Certyfikat CA i chain.crt

W powyższym przypadku CA zwraca podpisany certyfikat sever i dołącza certyfikat CA CA.crt, który jest plikiem chain.crt. Może to być zrobione przez niezabezpieczony kanał, ale klient jest zachęcany do potwierdzenia czy otrzymany chain.crt jest ważny, jeśli transport jest niezabezpieczony.

Możliwa jest zmiana nazwy pliku chain.crt na CA.crt na maszynie docelowej, jednak w kolejnych instrukcjach będziemy używać chain.crt.

6. Skonfiguruj serwer OpenVPN#

Połączenie wykorzystujące TLS wymaga wielu certyfikatów i kluczy do uwierzytelniania. Skoro już je wystawiliśmy i podpisaliśmy, możemy umieścić je we właściwych katalogach. Podział certyfikatów i kluczy, które muszą znajdować się w katalogu głównym, jest następujący:

OpenVPN server

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

Na swoim serwerze OpenVPN możesz teraz utworzyć plik konfiguracyjny server.conf za pomocą swojego ulubionego edytora tekstu. Plik może być skonfigurowany zgodnie z Twoimi potrzebami, a my zadbamy o to, aby zmienić sekcje certyfikatu i klucza serwera zgodnie z nazwami wybranymi przez Ciebie dla podpisanych przez nas plików:

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

Oto plik konfiguracyjny, którego możemy użyć do przetestowania tych instrukcji:

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

Aby sprawdzić, czy konfiguracja działa poprawnie, możemy użyć tej komendy:

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

7. Uruchomić usługę OpenVPN na serwerze#

Włącz usługę OpenVPN poprzez dodanie jej do systemctl, a następnie uruchom ją za pomocą tych poleceń:

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

Aby dwukrotnie sprawdzić, czy usługa OpenVPN jest aktywna, użyj tej komendy:

$ sudo systemctl status openvpn@server

W tym momencie OpenVPN powinien być uruchomiony.


Konfiguracja po stronie klienta#

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. Zainstaluj OpenVPN i Easy-RSA#

  1. Zainstaluj oprogramowanie

Możemy użyć bezpośrednio dnf install, aby zainstalować OpenVPN 2.4.9 i Easy-RSA 3.0.7.

$ sudo dnf install openvpn easy-rsa
  1. Następnie tworzymy jako non-root katalog dla Easy RSA o nazwie Easy-RSA.

$ mkdir ~/easyrsa
  1. I połącz go z pakietem Easy RSA, który właśnie zainstalowaliśmy

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

2. Utwórz PKI dla klienta OpenVPN#

W ten sam sposób, w jaki stworzyliśmy PKI na serwerze OpenVPN, stworzymy PKI używając Easy-RSA po stronie klienta.

3. Utwórz client.req i client.key.#

W ten sam sposób, w jaki wydaliśmy parę kluczy na serwerze, generujemy parę kluczy dla klienta, która będzie się składać z pliku client.req oraz pliku client.key. Ten ostatni musi być utrzymywany w tajemnicy na maszynie klienta.

4. Podpisz client.req i wystaw plik client.crt.#

Aby przenieść plik client.req na maszynę CA, użyjemy tej samej metody, co w przypadku pliku server.req.

Po przesłaniu, na maszynie CA podpiszemy plik z żądaniem podpisania certyfikatu tym poleceniem

$ 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. Zaimportuj client.crt na Nitrokey z maszyny CA.#

Po utworzeniu pliku client.crt, podłączamy urządzenie Nitrokey Pro 2 do maszyny CA i importujemy plik .crt do urządzenia Pro 2 za pomocą tego polecenia:

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

Możesz sprawdzić, czy klucz jest efektywnie przechowywany na Nitrokey za pomocą tego polecenia:

$ pkcs15-tool -c

Lub alternatywnie

$ pkcs11-tool --list-objects

Więcej poleceń można znaleźć na stronie OpenSC wiki.

6. Pobierz plik chain.crt z maszyny CA.#

My natomiast zachowujemy plik client.crtstored on the nitrokey Pro 2 device, we must retrieve the chain.crt na maszynie klienta i przechowujemy go w odpowiednim katalogu. Możemy użyć scp jak w metodzie wyjaśnionej w części serwerowej tego poradnika.

7. Skonfiguruj klienta do współpracy z Nitrokey#

Teraz z powrotem na komputerze klienckim podłączymy Nitrokey Pro i użyjemy go do ustanowienia połączenia VPN z serwerem. Ogólnie rzecz biorąc, połączenie, które używa TLS wymaga wielu certyfikatów i kluczy do uwierzytelnienia:

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

Dla tego przewodnika możemy stworzyć następujący plik client.conf i dodać do niego wymagane opcje:

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. Określ właściwy obiekt

Każdy dostawca PKCS#11 może obsługiwać wiele urządzeń. Aby wyświetlić listę dostępnych obiektów możesz użyć następującego polecenia:

$ openvpn --show-pkcs11-ids /usr/lib64/pkcs11/opensc-pkcs11.so

The following objects are available for use.
Each object shown below may be used as parameter to

--pkcs11-id option please remember to use single quote mark.

Certificate
       DN:             CN=client
       Serial:         E53DA75C5B8F1518F520BCEF0128C09F
       Serialized id:  pkcs11:model=pkcs11:model=PKCS%NNNN%20emulated;token=User%20PIN%20%28OpenPGP%20card%29;manufacturer=ZeitControl;serial=000NNNNNN;id=%03

Każda para certyfikat/klucz prywatny ma unikalny Serialized id ciąg znaków. Serializowany ciąg id żądanego certyfikatu powinien być określony w pliku konfiguracyjnym. Możemy to zrobić dodając opcję pkcs11-id używając pojedynczego cudzysłowu.

pkcs11-id 'pkcs11:model=pkcs11:model=PKCS%NNNN%20emulated;token=User%20PIN%20%28OpenPGP%20card%29;manufacturer=ZeitControl;serial=000NNNNNN;id=%03'
  1. Dodaj pobrany Serialized ID do pliku konfiguracyjnego

Używając swojego ulubionego edytora tekstu, otwórz plik server.conf i dodaj następujące linie, uważając, aby wstawić własne 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'

W przypadku dodatkowych ` ustawień związanych z uwierzytelnianiem OpenVPN <https://openvpn.net/community-resources/how-to/>`_ można również dodać kilka wierszy do obsługi zarządzania kluczami, choć jest to opcjonalne.

Informacja

Kliknij, aby zobaczyć kod

# 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

Krok opcjonalny

Jeśli potrzebujesz przetestować konfigurację, z i bez tokena na Nitrokey, możesz dodać linie do tego samego client.conf i skomentować/odkomentować odpowiednie linie zgodnie z Twoimi potrzebami:

Informacja

Kliknij, aby zobaczyć kod

# non_nitrokey login

# cert client.crt
# key client.key
# tls-auth ta.key 1
  1. Konfiguracja klienta OpenVPN

Końcowy plik konfiguracyjny client.conf powinien wyglądać tak jak ten:

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 problemy

Istnieją pewne znane problemy związane z logowaniem do OpenVPN za pomocą OpenSC. Proszę zapoznać się z tymi problemami tutaj.

8. Uruchom klienta OpenVPN#

  1. Uruchom usługę OpenVPN na kliencie

Włącz usługę OpenVPN i uruchom ją za pomocą tych poleceń:

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

Aby dwukrotnie sprawdzić, czy usługa OpenVPN jest aktywna, użyj tej komendy:

$ sudo systemctl status openvpn-server@server.service
  1. Wprowadź swój kod PIN użytkownika

Podczas uruchamiania klienta OpenVPN należy wprowadzić 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: ******

Ostrzeżenie

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)

W niektórych zgłoszonych przypadkach nie pojawia się monit o PIN na terminalu. Jednym z obejść byłoby użycie tej komendy do zalogowania się za pomocą PINu:

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

Alternatywnie, można ` przekompilować klienta OpenVPN <https://forums.openvpn.net/viewtopic.php?f=4&t=23318>`_ z wyłączoną obsługą systemd, co spowoduje wyświetlenie monitu o podanie kodu PIN zgodnie z oczekiwaniami.

Inną opcją jest zalogowanie się do instancji OpenVPN za pomocą klienta Viscosity, który zapewnia lepsze doświadczenie użytkownika, zwłaszcza przy wprowadzaniu kodu PIN.