OpenVPN-konfigurointi Easy-RSA:n avulla#

(Nitrokey Storage 2 - Linux)

Muista

Tämä opas on keskeneräinen, ja sitä päivitetään säännöllisesti. Ota tämä tila huomioon.

Tässä oppaassa näytetään, miten OpenVPN-asiakkaat määritetään kirjautumaan sisään Nitrokey Pro 2 tai Nitrokey Storage 2:n avulla. Ohjelmistoavainten hallintaan käytämme Easy-RSA-apuohjelmaa, joka on kehittynyt OpenVPN:n rinnalla.

Varmenteiden allekirjoittamiseen käytämme Nitrokey HSM 2:tä, joka on määritetty Varmenneviranomaiseksi, Tässä oppaassa ei kuitenkaan käsitellä itse CA:n perustamista (se on selkeä ja hyvin dokumentoitu täällä).

Käytämme Easy-RSA:ta, koska se näyttää tarjoavan jonkin verran joustavuutta ja mahdollistaa avainten hallinnan ulkoisten PKI:iden kautta. Käytämme sitä palvelimella allekirjoituspyynnön tekemiseen ja toistamme saman prosessin asiakkaalla. Varmenteen allekirjoituspyynnöt allekirjoittaa Nitorkey HSM:ssä oleva varmentaja, ja ne lähetetään uudelleen palvelimelle ja asiakkaalle.

Edellytykset#

Seuraavassa dokumentaatiossa tarvitsemme 3 eri konetta seuraavasti:

  • OpenVPN-palvelin (v. 2.5) Debian 10:llä (EC2-virtuaalikone - AWS).

  • OpenVPN-asiakasohjelma (v. 2.4.9) Fedora 30:ssä (paikallinen kone).

  • Varmenteiden myöntäjään pääsee käsiksi Fedora 30:llä varustetusta erillisestä koneesta (paikallinen kone).

Jotta voimme olla vuorovaikutuksessa laitteiden kanssa, tarvitsemme OpenSC 0.20 asennettuna asiakas- ja CA-koneeseen (paikalliset koneet). Voit seurata ohjeita sen asentamiseksi tämän linkin (*Unix) kautta.

Voit ladata riippuvuudet Fedora-koneisiin voimme tämän ohjeen:

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

Debian Linuxille uudemmat OpenSC-paketit ovat saatavilla täältä.

Käytämme fyysisten avainten hallintaan seuraavia Nitrokeys-menetelmiä:

Muistutuksena, että voit rakentaa varmenteiden myöntäjän Nitrokey HSM 2:een noudattamalla dokumentaatiossa ` olevia ohjeita <certificate-authority.html#sign-a-server-certificate>`_.

Vaihtoehtoisesti voit perustaa oman CA:n erilliselle koneelle tai käyttää OpenVPN-opasohjelmaa, joka perustuu myös Easy-RSA. Kaksi viimeistä vaihtoehtoa luottavat ohjelmistoratkaisuihin avainten hallinnassa.


Palvelimen puolella#

1. Asenna OpenVPN#

  1. Ensin meidän on otettava IP-toimintojen välitys käyttöön muokkaamalla /etc/sysctl.conf-tiedostoa.

$ editor /etc/sysctl.conf
  1. Poista kommentti tai muokkaa vastaavasti seuraavaa riviä

net.ipv4.ip_forward=1
  1. Sulje se tallennuksen jälkeen ja anna tämä komento

$ sysctl -p

Kun IP:n välitys on tehty, meidän on ladattava OpenvPN:n uusin versio Debian 10 -palvelimellemme ` näiden ohjeiden <https://community.openvpn.net/openvpn/wiki/OpenvpnSoftwareRepos>`_ mukaan:

  1. Vaihda pääkäyttäjäksi ja lataa GPG-avain, jolla paketti on allekirjoitettu.

$ sudo -s
# wget -O - https://swupdate.openvpn.net/repos/repo-public.gpg|apt-key add -
  1. Lisää asianmukaisten OpenVPN-pakettien URL-osoitteet tiedostoon sources.list.

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

Latasimme OpenVPN 2.5:n, koska ”salasanakysely” vaatii vähintään OpenVPN version 2.4.8 kirjautumista varten.

  1. Seuraavaksi lataamme OpenVPN:n

$ sudo apt install openvpn

Jos haluat tarkistaa version, se on mahdollista kutsumalla --version ja tulostamalla seuraavat:

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

PKI:n rakentamiseksi lataamme Easy-RSA:n uusimman version palvelin- ja asiakaskoneisiin. Uusimman version hankkimiseksi siirry virallisen EasyRSA GitHub -projektin Releases-sivulle, kopioi latauslinkki tiedostolle, jonka pääte on .tgz, ja liitä se seuraavaan komentoon:

  1. Lataa uusin versio

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

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

3. Luo PKI OpenVPN-palvelimelle#

Ennen kuin voit luoda OpenVPN-palvelimen yksityisen avaimen ja varmenteen, sinun on luotava paikallinen Public Key Infrastructure -hakemisto OpenVPN-palvelimelle. Käytät tätä hakemistoa palvelimen ja asiakkaiden varmennepyyntöjen hallintaan sen sijaan, että tekisit ne suoraan CA-palvelimelle.

Jotta voit rakentaa PKI-hakemiston OpenVPN-palvelimellesi, sinun on täytettävä tiedosto nimeltä vars joillakin oletusarvoilla.

  1. Luo tiedosto vars.

$ touch ~/easyrsa/vars
$ cd easyrsa/
$ editor vars
  1. Kun tiedosto on avattu, liitä seuraavat kaksi riviä tiedostoon

set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"

Nämä ovat ainoat kaksi riviä, joita tarvitset tässä vars-tiedostossa OpenVPN-palvelimellasi, koska sitä ei käytetä varmenteiden myöntäjänä. Ne varmistavat, että yksityiset avaimesi ja varmennepyyntösi on konfiguroitu käyttämään Elliptic Curve Cryptography (ECC) -tekniikkaa avainten ja turvallisten allekirjoitusten luomiseen asiakkaillesi ja OpenVPN-palvelimelle.

Mitä tulee kryptografisten algoritmien valintaan, noudatan tämän opetusohjelman mallia, ja voit muokata niitä omien tarpeidesi mukaan.

  1. PKI:n alustaminen

Kun olet täyttänyt tiedoston vars, voit jatkaa PKI-hakemiston luomista. Suorita easyrsa-skripti init-pki-optiolla:

$ ./easyrsa init-pki

Kun olet alustanut PKI:n OpenVPN-palvelimella, voit siirtyä seuraavaan vaiheeseen eli OpenVPN-palvelimen varmennepyynnön ja yksityisen avaimen luomiseen.

4. Luo server.req ja server.key.#

Nyt kun OpenVPN-palvelimellesi on asennettu kaikki ennakkoedellytykset, seuraava vaihe on luoda avainpari, joka koostuu yksityisestä avaimesta (joka on pidettävä salassa) ja Certificate Signing Request (.csr) OpenVPN-palvelimellesi.

Yleisesti ottaen järjestelmissä, joissa luodaan avain ja pyyntö, nämä tiedostot jätetään salaamattomiksi käyttämällä nopass-argumenttia, koska palvelimet on yleensä käynnistettävä ilman salasanan syöttöä. Tämä tuottaa salakirjoittamattoman avaimen, joten muista suojata sen käyttö- ja tiedosto-oikeudet huolellisesti.

Vihje

OpenVPN:n konfigurointiohjeita:

  1. Palvelimella ja jokaisella asiakkaalla on oltava oma varmennetiedostonsa ja avaintiedostonsa. Palvelin ja kaikki asiakkaat käyttävät samaa CA-tiedostoa.

  2. Palvelinvarmenteessa on oltava seuraavat ominaisuudet:

  • keyUsage:  digitalSignature, keyEncipherment`

  • ``extendedKeyUsage: serverAuth``extendedKeyUsage: serverAuthextendedKeyUsage: serverAuth`

  1. Luo palvelimen allekirjoituspyyntö

Siirry OpenVPN-palvelimen ~/easyrsa-hakemistoon ei-root-käyttäjänä ja kirjoita seuraavat komennot:

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

Tämä luo palvelimelle yksityisen avaimen ja varmennepyyntötiedoston nimeltä server.req.

Kun sinulla on allekirjoitettu varmenne, siirrät sen takaisin OpenVPN-palvelimelle.

  1. Kopioi avain OpenVPN-palvelimen hakemistoon.

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

Kun olet suorittanut nämä vaiheet, olet onnistuneesti luonut yksityisen avaimen OpenVPN-palvelimelle. Olet myös luonut OpenVPN-palvelimen varmenteen allekirjoituspyynnön.

Vihje

Varmenteen allekirjoituspyyntöjen tiedostopäätteet

CA:n ja HSM:n opetusohjelmassa käytetty tiedostopääte viittaa .csr-tiedoston luomiseen, mutta Easy-RSA luo varmenteen allekirjoituspyynnöt, joiden tiedostopääte on .req.

Käytämme molempia laajennuksia vaihdellen ja varmistamme samalla, että siirretään oikeat tiedostot varmennepalveluun, ja luomme lopullisen varmenteen, jolla on .crt -laajennus.

Tämän oppaan seuraavassa osassa allekirjoitamme .req-tiedoston HSM 2 -laitteeseen asennetun CA:n kanssa. Tätä tarkoitusta varten käytän erillistä konetta pyyntöjen allekirjoittamiseen.

5. Allekirjoitus ja haku server.crt`#

Seuraavat ohjeet edellyttävät server.req (tai server.csr) tiedoston siirtämistä CA-järjestelmään.

Siirto itsessään ei ole tietoturva-altis, mutta on viisasta tarkistaa, että vastaanotettu tiedosto vastaa lähettäjän kopiota, jos siirto on epäluotettava.

Näiden vaiheiden läpikäymisessä luotan laajalti näihin ohjeisiin allekirjoittaakseni varmenteen allekirjoituspyynnöt, kun olemme luoneet ne Easy-RSA:lla.

5.1. Allekirjoita tiedosto server.req.#

HSM:n käyttöön tarkoitetulla paikallisella koneella käytämme Opensc 0.20:n tarjoamia työkaluja allekirjoittaaksemme .req-tiedoston ja lähetämme sen takaisin OpenVPN-palvelimelle. Oletamme, että olemme siirtäneet tiedoston palvelinkoneelta CA-koneelle.

Aloitamme ensin liittämällä HSM Nitrokey -avaimen ja syöttämällä tämän ohjeen käytettävissä olevien avainten luetteloimiseksi.

  1. Kysy käytettävissä olevien laitteiden luetteloa

  $ 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.
  • Avaimen URI:n on oltava tässä muodossa:

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. Luo openvpn/-hakemisto alle certificate-authority/.

$ mkdir/opt/certificate-authority/
$ cd /opt/certificate-authority/
  1. Allekirjoita 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. Hae server.crt-tiedosto palvelinkoneelle.#

  1. Siirrä allekirjoitetut varmenteet palvelimelle

Kopioi CA-koneelta tiedostot server.crt ja chain.crt OpenVPN-palvelimelle. Tässä esimerkissä käytämme komentoa scp seuraavasti:

$ scp openvpn/{server.crt,chain.crt} admin@your_openvpnserver_ip:/tmp
  1. Aseta varmenteet palvelimen hakemistoon

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

Varoitus

CA-varmenne ja chain.crt

Edellä esitetyssä tapauksessa varmentaja palauttaa allekirjoitetun sever-varmenteen ja sisältää varmentajan varmenteen CA.crt, joka on chain.crt-tiedosto. Tämä voidaan tehdä turvattoman kanavan kautta, mutta asiakasta kehotetaan kuitenkin varmistamaan, onko vastaanotettu chain.crt kelvollinen, jos siirto on epäluotettava.

Tiedosto chain.crt on mahdollista nimetä uudelleen CA.crt-tiedostoksi kohdekoneella, käytämme kuitenkin chain.crt seuraavissa ohjeissa.

6. Määritä OpenVPN-palvelin#

TLS:ää käyttävä yhteys vaatii useita varmenteita ja avaimia todennusta varten. Nyt kun olemme myöntäneet ja allekirjoittaneet ne, voimme sijoittaa ne oikeisiin hakemistoihin. Jako varmenteista ja avaimista, joiden on sijaittava juurihakemistossa, on seuraava:

OpenVPN server

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

OpenVPN-palvelimellasi voit nyt luoda konfiguraatiotiedoston server.conf suosikkitekstieditorillasi. Tiedosto voidaan konfiguroida tarpeidesi mukaan, ja samalla varmistamme, että palvelinvarmenteen ja avaimen osiot muutetaan niiden nimien mukaan, jotka valitsit allekirjoittamillesi tiedostoille:

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

Tässä on asetustiedosto, jota voimme käyttää näiden ohjeiden testaamiseen:

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

Voimme testata, toimiiko kokoonpano oikein, käyttämällä tätä komentoa:

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

7. Käynnistä OpenVPN-palvelu palvelimella#

Ota OpenVPN-palvelu käyttöön lisäämällä se systemctl:ään ja käynnistä se näillä komennoilla:

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

Voit tarkistaa, onko OpenVPN-palvelu aktiivinen, käyttämällä tätä komentoa:

$ sudo systemctl status openvpn@server

OpenVPN:n pitäisi olla käynnissä tässä vaiheessa.


Asiakaspuolen konfigurointi#

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. Asenna OpenVPN ja Easy-RSA#

  1. Asenna ohjelmisto

Voimme käyttää suoraan dnf install asentaaksemme OpenVPN 2.4.9 ja Easy-RSA 3.0.7.

$ sudo dnf install openvpn easy-rsa
  1. Sitten luodaan ei-root-hakemisto Easy RSA:lle nimellä Easy-RSA`.

$ mkdir ~/easyrsa
  1. Ja linkitä se juuri asentamaamme Easy RSA -pakettiin.

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

2. Luo PKI OpenVPN-asiakkaalle.#

Samalla tavalla kuin loimme PKI:n OpenVPN-palvelimelle, luomme PKI:n Easy-RSA:n avulla asiakkaan puolelle.

3. Luo client.req ja client.key.#

Samalla tavalla kuin annoimme avainparin palvelimelle, luomme asiakkaalle avainparin, joka koostuu tiedostosta client.req ja tiedostosta client.key. Jälkimmäinen on pidettävä salassa asiakaskoneella.

4. Allekirjoita client.req ja anna client.crt tiedosto.#

Siirtääksemme tiedoston client.req CA-koneelle, käytämme samaa menetelmää kuin tiedoston server.req kohdalla.

Kun varmenne on siirretty, allekirjoitamme varmenteen allekirjoituspyyntötiedoston CA-koneella tällä komennolla

$ 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. Tuo client.crt Nitrokey-koneeseen CA-koneesta.#

Kun client.crt-tiedosto on luotu, liitämme Nitrokey Pro 2 -laitteen CA-koneeseen ja tuomme .crt-tiedoston Pro 2 -laitteeseen tällä komennolla:

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

Voit nähdä, onko avain tallennettu Nitrokey-avaimeen tehokkaasti käyttämällä tätä komentoa:

$ pkcs15-tool -c

Tai vaihtoehtoisesti

$ pkcs11-tool --list-objects

Lisää komentoja löydät OpenSC wikistä.

6. Hae chain.crt-tiedosto CA-koneelta.#

Vaikka pidämme client.crtstored on the nitrokey Pro 2 device, we must retrieve the chain.crt-tiedoston asiakaskoneella ja tallennamme sen sopivaan hakemistoon. Voimme käyttää scp kuten tämän oppaan palvelinosiossa selitetyssä menetelmässä.

7. Määritä asiakasohjelma toimimaan vuorovaikutuksessa Nitrokeyn kanssa.#

Takaisin asiakaskoneessa kytkemme Nitrokey Pron ja käytämme sitä VPN-yhteyden muodostamiseen palvelimeen. Yleisesti ottaen TLS:ää käyttävä yhteys vaatii useita varmenteita ja avaimia todennusta varten:

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

Tätä opasta varten voimme käyttää seuraavaa client.conf-tiedostoa ja lisätä siihen tarvittavat asetukset:

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. Määritä oikea kohde

Kukin PKCS#11-palveluntarjoaja voi tukea useita laitteita. Voit tarkastella käytettävissä olevien kohteiden luetteloa seuraavalla komennolla:

$ 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

Jokaisella varmenne/yksityinen avain -parilla on yksilöllinen Serialized id merkkijono. Pyydetyn varmenteen sarjallistettu id-merkkijono on määritettävä asetustiedostossa. Tämä voidaan tehdä lisäämällä pkcs11-id -vaihtoehto käyttäen yksinkertaisia lainausmerkkejä.

pkcs11-id 'pkcs11:model=pkcs11:model=PKCS%NNNN%20emulated;token=User%20PIN%20%28OpenPGP%20card%29;manufacturer=ZeitControl;serial=000NNNNNN;id=%03'
  1. Lisää haettu sarjallistettu tunnus konfiguraatiotiedostoon.

Avaa server.conf-tiedosto suosikkitekstieditorillasi ja lisää siihen seuraavat rivit, mutta huolehdi siitä, että lisäät omat 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'

OpenVPN- todennukseen liittyviä lisäasetuksia varten voit myös lisätä muutaman rivin avainten hallintaa varten, vaikka se onkin vapaaehtoista.

Muista

Klikkaa nähdäksesi koodin

# 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

Valinnainen vaihe

Jos haluat testata kokoonpanoa Nitrokey-koodin kanssa ja ilman sitä, voit lisätä rivejä samaan client.conf ja kommentoida/poistaa kommentit tarpeidesi mukaan:

Muista

Klikkaa nähdäksesi koodin

# non_nitrokey login

# cert client.crt
# key client.key
# tls-auth ta.key 1
  1. OpenVPN-asiakkaan määrittäminen

Lopullisen konfiguraatiotiedoston client.conf pitäisi näyttää tältä:

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. Tunnetut ongelmat

OpenVPN-kirjautumiseen OpenSC:n kanssa liittyy joitakin tunnettuja ongelmia. Tutustu näihin ongelmiin täällä.

8. Käynnistä OpenVPN-asiakasohjelma#

  1. Käynnistä OpenVPN-palvelu asiakkaalla

Ota OpenVPN-palvelu käyttöön ja käynnistä se näillä komennoilla:

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

Voit tarkistaa, onko OpenVPN-palvelu aktiivinen, käyttämällä tätä komentoa:

$ sudo systemctl status openvpn-server@server.service
  1. Syötä käyttäjän PIN-koodi

Kun OpenVPN-asiakasohjelma suoritetaan, Nitrokeyn PIN-koodi on syötettävä:

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

Varoitus

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)

Joissakin tapauksissa se ei pyydä PIN-koodia päätelaitteessa. Yksi kiertotapa olisi käyttää tätä komentoa kirjautumiseen PIN-koodilla:

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

Vaihtoehtoisesti voit kokoonpanna OpenVPN-asiakkaan uudelleen, kun systemd-tuki on poistettu käytöstä, ja se kysyy PIN-koodia odotetusti.

Toinen vaihtoehto olisi kirjautua OpenVPN-instanssiin Viscosity-asiakasohjelmalla, joka tarjoaa paremman käyttökokemuksen erityisesti PIN-koodin syöttämisessä.