Διαμόρφωση OpenVPN με το Easy-RSA#

(Nitrokey Pro 2 - Linux)

Σημείωση

Αυτός ο οδηγός είναι σε εξέλιξη και θα ενημερώνεται ανάλογα. Παρακαλούμε να λάβετε υπόψη αυτή την κατάσταση.

Αυτός ο οδηγός δείχνει πώς να ρυθμίζετε τους πελάτες OpenVPN ώστε να συνδέονται χρησιμοποιώντας ένα Nitrokey Pro 2 ή ένα Nitrokey Storage 2. Για τη διαχείριση κλειδιών λογισμικού θα χρησιμοποιήσουμε το Easy-RSA, ένα βοηθητικό πρόγραμμα που εξελίσσεται παράλληλα με το OpenVPN.

Για την υπογραφή των πιστοποιητικών, θα χρησιμοποιήσουμε ένα Nitrokey HSM 2 που έχει οριστεί ως Αρχή έκδοσης πιστοποιητικών, ωστόσο ο παρών οδηγός δεν καλύπτει τη ρύθμιση της ίδιας της CA (είναι σαφής και καλώς τεκμηριωμένη εδώ).

Θα χρησιμοποιήσουμε το Easy-RSA, επειδή φαίνεται να παρέχει κάποια ευελιξία και επιτρέπει τη διαχείριση κλειδιών μέσω εξωτερικών PKI. Θα το χρησιμοποιήσουμε στον διακομιστή για να εκδώσουμε το αίτημα υπογραφής και θα επαναλάβουμε την ίδια διαδικασία στον πελάτη. Οι αιτήσεις υπογραφής πιστοποιητικών θα υπογράφονται από την CA στο Nitorkey HSM και θα μεταδίδονται εκ νέου στον διακομιστή και τον πελάτη.

Προαπαιτούμενα#

Στην ακόλουθη τεκμηρίωση θα χρειαστούμε 3 διαφορετικά μηχανήματα ως εξής:

  • Εξυπηρετητής OpenVPN (v. 2.5) σε Debian 10 (εικονική μηχανή EC2 - AWS)

  • Πελάτης OpenVPN (v. 2.4.9) στο Fedora 30 (τοπικό μηχάνημα)

  • Η Αρχή Πιστοποιητικών θα είναι προσβάσιμη από ένα αυτόνομο μηχάνημα με Fedora 30 (τοπικό μηχάνημα)

Για την αλληλεπίδραση με τις συσκευές θα χρειαστεί OpenSC 0.20 εγκατεστημένο στο μηχάνημα του πελάτη και του CA (τα τοπικά μηχανήματα). Μπορείτε να ακολουθήσετε τις οδηγίες για την εγκατάστασή του σε αυτό το σύνδεσμο (*Unix).

Για να κατεβάσετε τις εξαρτήσεις σε μηχανήματα Fedora μπορούμε να ακολουθήσουμε αυτή την οδηγία:

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

Για το Debian Linux, πιο πρόσφατα πακέτα OpenSC είναι διαθέσιμα εδώ.

Θα χρησιμοποιήσουμε τα ακόλουθα Nitrokeys για τη διαχείριση των φυσικών κλειδιών:

  • Ένα κλειδί ελέγχου ταυτότητας με χρήση του Nitrokey Pro 2 (pdf)

  • Μια αρχή έκδοσης πιστοποιητικών (CA) που χρησιμοποιεί το Nitrokey HSM 2 (pdf)

Ως υπενθύμιση, για να δημιουργήσετε μια Αρχή Πιστοποιητικών στο Nitrokey HSM 2, μπορείτε να ακολουθήσετε τις οδηγίες που είναι διαθέσιμες στην τεκμηρίωση.

Εναλλακτικά, μπορείτε να δημιουργήσετε τη δική σας CA σε ένα σε ένα ξεχωριστό μηχάνημα ή να χρησιμοποιήσετε το σεμινάριο OpenVPN, το οποίο βασίζεται επίσης στο Easy-RSA. Οι 2 τελευταίες επιλογές βασίζονται σε λύσεις λογισμικού για τη διαχείριση των κλειδιών.


Πλευρά διακομιστή#

1. Εγκαταστήστε το OpenVPN#

  1. Πρώτα πρέπει να ενεργοποιήσουμε την προώθηση IP με την επεξεργασία του αρχείου /etc/sysctl.conf.

$ editor /etc/sysctl.conf
  1. Αποσχολιάστε ή επεξεργαστείτε αναλόγως την ακόλουθη γραμμή

net.ipv4.ip_forward=1
  1. Κλείστε το μετά την αποθήκευση και εισαγάγετε αυτή την εντολή

$ sysctl -p

Μόλις γίνει η προώθηση IP, θα πρέπει να κατεβάσουμε την τελευταία έκδοση του OpenvPN για τον διακομιστή μας Debian 10, σύμφωνα με τις οδηγίες αυτές:

  1. Αλλάξτε σε root και κατεβάστε το κλειδί GPG που υπέγραψε το πακέτο

$ sudo -s
# wget -O - https://swupdate.openvpn.net/repos/repo-public.gpg|apt-key add -
  1. Προσθέστε τη διεύθυνση URL των κατάλληλων πακέτων OpenVPN στο αρχείο sources.list.

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

Κατεβάσαμε το OpenVPN 2.5, καθώς η «προτροπή κωδικού πρόσβασης» απαιτεί τουλάχιστον OpenVPN έκδοση 2.4.8 για να συνδεθείτε.

  1. Στη συνέχεια κατεβάζουμε το OpenVPN

$ sudo apt install openvpn

Αν θέλετε να ελέγξετε την έκδοση, μπορείτε να το κάνετε καλώντας --version και να εκτυπώσετε τα εξής:

$ 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. Εγκαταστήστε το Easy-RSA#

Για να δημιουργήσουμε το PKI, θα κατεβάσουμε την τελευταία έκδοση του Easy-RSA στους υπολογιστές διακομιστή και πελάτη. Για να λάβετε την τελευταία έκδοση, μεταβείτε στη σελίδα Releases στο επίσημο έργο EasyRSA GitHub, αντιγράψτε το σύνδεσμο λήψης για το αρχείο που τελειώνει σε .tgz και στη συνέχεια επικολλήστε τον στην ακόλουθη εντολή:

  1. Κατεβάστε την τελευταία έκδοση

$ cd ~
wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.7/EasyRSA-3.0.7.tgz
  1. Αποσυμπιέστε το tarball

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

3. Δημιουργία PKI για διακομιστή OpenVPN#

Πριν μπορέσετε να δημιουργήσετε το ιδιωτικό κλειδί και το πιστοποιητικό του διακομιστή OpenVPN, πρέπει να δημιουργήσετε έναν τοπικό κατάλογο Υποδομής δημόσιου κλειδιού στον διακομιστή OpenVPN. Θα χρησιμοποιήσετε αυτόν τον κατάλογο για τη διαχείριση των αιτήσεων πιστοποιητικών του διακομιστή και των πελατών, αντί να τις κάνετε απευθείας στον διακομιστή CA σας.

Για να δημιουργήσετε έναν κατάλογο PKI στον διακομιστή OpenVPN, θα πρέπει να συμπληρώσετε ένα αρχείο με όνομα vars με ορισμένες προεπιλεγμένες τιμές.

  1. Δημιουργήστε ένα αρχείο vars.

$ touch ~/easyrsa/vars
$ cd easyrsa/
$ editor vars
  1. Μόλις ανοίξετε το αρχείο, επικολλήστε τις ακόλουθες δύο γραμμές

set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"

Αυτές είναι οι μόνες δύο γραμμές που χρειάζεστε σε αυτό το αρχείο vars στον διακομιστή OpenVPN, καθώς δεν θα χρησιμοποιηθεί ως Αρχή Πιστοποιητικών. Θα διασφαλίσουν ότι τα ιδιωτικά σας κλειδιά και τα αιτήματα πιστοποιητικών έχουν ρυθμιστεί ώστε να χρησιμοποιούν κρυπτογραφία ελλειπτικής καμπύλης (ECC) για τη δημιουργία κλειδιών και ασφαλών υπογραφών για τους πελάτες σας και τον διακομιστή OpenVPN.

Όσον αφορά την επιλογή των κρυπτογραφικών αλγορίθμων, ακολουθώ το μοντέλο του αυτού του σεμιναρίου, και μπορείτε να τα προσαρμόσετε ανάλογα με τις δικές σας ανάγκες.

  1. Αρχικοποίηση του PKI

Μόλις συμπληρώσετε το αρχείο vars μπορείτε να προχωρήσετε στη δημιουργία του καταλόγου PKI. Για να το κάνετε αυτό, εκτελέστε το σενάριο easyrsa με την επιλογή init-pki:

$ ./easyrsa init-pki

Αφού αρχικοποιήσετε το PKI σας στο διακομιστή OpenVPN, είστε έτοιμοι να προχωρήσετε στο επόμενο βήμα, που είναι η δημιουργία αίτησης πιστοποιητικού διακομιστή OpenVPN και ιδιωτικού κλειδιού.

4. Δημιουργήστε server.req και server.key#

Τώρα που ο διακομιστής σας OpenVPN έχει εγκαταστήσει όλα τα προαπαιτούμενα, το επόμενο βήμα είναι να δημιουργήσετε ένα ζεύγος κλειδιών που αποτελείται από ένα ιδιωτικό κλειδί (το οποίο πρέπει να κρατήσετε μυστικό) και ένα αίτημα υπογραφής πιστοποιητικού (.csr) στον διακομιστή σας OpenVPN.

Σε γενικές γραμμές, στα συστήματα όπου δημιουργούμε ένα κλειδί και ένα αίτημα, τα αρχεία αυτά αφήνονται μη κρυπτογραφημένα με τη χρήση του επιχειρήματος nopass, δεδομένου ότι οι διακομιστές πρέπει συνήθως να ξεκινούν χωρίς την εισαγωγή κωδικού πρόσβασης. Αυτό δημιουργεί ένα αποκρυπτογραφημένο κλειδί, οπότε προσέξτε προστατεύστε προσεκτικά την πρόσβαση και τα δικαιώματα πρόσβασης σε αρχεία.

Πρακτική συμβουλή

Σημειώσεις διαμόρφωσης από το OpenVPN:

  1. Ο διακομιστής και κάθε πελάτης πρέπει να έχουν το δικό τους αρχείο πιστοποιητικού και κλειδιού. Ο διακομιστής και όλοι οι πελάτες θα χρησιμοποιούν το ίδιο αρχείο CA.

  2. Το πιστοποιητικό διακομιστή πρέπει να έχει τα εξής:

  • keyUsage:  digitalSignature, keyEncipherment

  • extendedKeyUsage: serverAuth

  1. Δημιουργήστε την αίτηση υπογραφής για το διακομιστή

Πλοηγηθείτε στον κατάλογο ~/easyrsa στον διακομιστή OpenVPN ως χρήστης που δεν είναι root και εισαγάγετε τις ακόλουθες εντολές:

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

Αυτό θα δημιουργήσει ένα ιδιωτικό κλειδί για τον διακομιστή και ένα αρχείο αίτησης πιστοποιητικού με όνομα server.req.

Μόλις αποκτήσετε ένα υπογεγραμμένο πιστοποιητικό, θα το μεταφέρετε πίσω στον διακομιστή OpenVPN.

  1. Αντιγράψτε το κλειδί στον κατάλογο του διακομιστή OpenVPN

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

Μετά την ολοκλήρωση αυτών των βημάτων, έχετε δημιουργήσει με επιτυχία ένα ιδιωτικό κλειδί για το διακομιστή OpenVPN. Έχετε επίσης δημιουργήσει ένα αίτημα υπογραφής πιστοποιητικού για το διακομιστή OpenVPN.

Πρακτική συμβουλή

Επεκτάσεις αρχείων για αιτήσεις υπογραφής πιστοποιητικών

Η επέκταση αρχείου που υιοθετείται από το σεμινάριο CA και HSM υποδεικνύει τη δημιουργία ενός αρχείου .csr, ωστόσο το Easy-RSA δημιουργεί αιτήσεις υπογραφής πιστοποιητικών με επέκταση .req.

Θα χρησιμοποιήσουμε εναλλακτικά και τις δύο επεκτάσεις, ενώ θα βεβαιωθούμε ότι μεταφέρουμε τα σωστά αρχεία στην Αρχή Πιστοποιητικών και θα δημιουργήσουμε ένα τελικό πιστοποιητικό με επέκταση .crt.

Στην επόμενη ενότητα αυτού του οδηγού, θα υπογράψουμε ένα αρχείο .req με την CA που έχουμε αναπτύξει στη συσκευή HSM 2. Για το σκοπό αυτό, θα χρησιμοποιήσω ένα ειδικό μηχάνημα για την υπογραφή των αιτήσεων.

5. Υπογραφή και ανάκτηση server.crt#

Οι ακόλουθες οδηγίες απαιτούν τη μεταφορά του αρχείου server.reqserver.csr) στο σύστημα CA.

Η ίδια η μεταφορά δεν είναι ευαίσθητη στην ασφάλεια, αν και είναι συνετό να επαληθεύετε αν το αρχείο που λαμβάνετε ταιριάζει με το αντίγραφο του αποστολέα, αν η μεταφορά δεν είναι αξιόπιστη.

Για να προχωρήσω σε αυτά τα βήματα, θα βασιστώ εκτενώς στις αυτές τις οδηγίες, για να υπογράψω τις αιτήσεις υπογραφής πιστοποιητικών, αφού τις δημιουργήσουμε με το Easy-RSA.

5.1. Υπογραφή του αρχείου server.req#

Στο τοπικό μηχάνημα που προορίζεται για την πρόσβαση στο HSM, θα χρησιμοποιήσουμε τα εργαλεία που παρέχει το Opensc 0.20 για να υπογράψουμε το αρχείο .req και να το στείλουμε πίσω στον διακομιστή OpenVPN. Υποθέτουμε ότι έχουμε μεταφέρει το αρχείο από το μηχάνημα του διακομιστή στο μηχάνημα της CA.

Αρχικά ξεκινάμε συνδέοντας το HSM Nitrokey και εισάγουμε αυτή την εντολή για την απαρίθμηση των διαθέσιμων πλήκτρων.

  1. Αναζήτηση της λίστας των διαθέσιμων συσκευών

  $ 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 του κλειδιού πρέπει να έχει αυτή τη μορφή:

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. Δημιουργήστε τον κατάλογο openvpn/ κάτω από τον κατάλογο certificate-authority/

$ mkdir/opt/certificate-authority/
$ cd /opt/certificate-authority/
  1. Υπογράψτε το 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. Ανάκτηση του αρχείου server.crt στο μηχάνημα του διακομιστή#

  1. Μεταφορά των υπογεγραμμένων πιστοποιητικών στο διακομιστή

Από το μηχάνημα CA, αντιγράψτε τα αρχεία server.crt και chain.crt στο διακομιστή OpenVPN. Σε αυτό το παράδειγμα θα χρησιμοποιήσουμε την εντολή scp ως εξής:

$ scp openvpn/{server.crt,chain.crt} admin@your_openvpnserver_ip:/tmp
  1. Τοποθετήστε τα πιστοποιητικά στον κατάλογο του διακομιστή

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

Προειδοποίηση

Πιστοποιητικό CA και chain.crt

Στην παραπάνω περίπτωση, η CA επιστρέφει το υπογεγραμμένο πιστοποιητικό sever και περιλαμβάνει το πιστοποιητικό CA CA.crt το οποίο είναι το αρχείο chain.crt. Αυτό μπορεί να γίνει μέσω ενός μη ασφαλούς καναλιού, αν και ο πελάτης ενθαρρύνεται να επιβεβαιώσει εάν το λαμβανόμενο chain.crt είναι έγκυρο, εάν η μεταφορά δεν είναι αξιόπιστη.

Είναι δυνατή η μετονομασία του αρχείου chain.crt σε CA.crt στο μηχάνημα-στόχο, ωστόσο θα χρησιμοποιήσουμε το chain.crt στις επόμενες οδηγίες.

6. Διαμόρφωση του διακομιστή OpenVPN#

Μια σύνδεση που χρησιμοποιεί το TLS απαιτεί πολλαπλά πιστοποιητικά και κλειδιά για τον έλεγχο ταυτότητας. Τώρα που τα εκδώσαμε και τα υπογράψαμε, μπορούμε να τα τοποθετήσουμε στους σωστούς καταλόγους. Η κατανομή των πιστοποιητικών και των κλειδιών που πρέπει να βρίσκονται στο ριζικό κατάλογο είναι η ακόλουθη:

OpenVPN server

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

Στο διακομιστή OpenVPN, μπορείτε τώρα να δημιουργήσετε το αρχείο ρυθμίσεων server.conf με τον αγαπημένο σας επεξεργαστή κειμένου. Το αρχείο μπορεί να διαμορφωθεί σύμφωνα με τις ανάγκες σας, ενώ εμείς φροντίζουμε να αλλάξουμε τα τμήματα του πιστοποιητικού και του κλειδιού του διακομιστή σύμφωνα με τα ονόματα που επιλέξατε για τα αρχεία που υπογράψαμε:

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

Εδώ είναι το αρχείο ρυθμίσεων που μπορούμε να χρησιμοποιήσουμε για τη δοκιμή αυτών των οδηγιών:

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

Για να ελέγξουμε αν η διαμόρφωση λειτουργεί σωστά, μπορούμε να χρησιμοποιήσουμε αυτή την εντολή:

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

7. Εκκινήστε την υπηρεσία OpenVPN στο διακομιστή#

Ενεργοποιήστε την υπηρεσία OpenVPN προσθέτοντάς την στο systemctl και εκκινήστε την χρησιμοποιώντας αυτές τις εντολές:

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

Για να ελέγξετε διπλά αν η υπηρεσία OpenVPN είναι ενεργή, χρησιμοποιήστε αυτήν την εντολή:

$ sudo systemctl status openvpn@server

Το OpenVPN θα πρέπει να εκτελείται σε αυτό το σημείο.


Διαμόρφωση από την πλευρά του πελάτη#

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. Εγκαταστήστε το OpenVPN και το Easy-RSA#

  1. Εγκαταστήστε το λογισμικό

Μπορούμε να χρησιμοποιήσουμε απευθείας dnf install για να εγκαταστήσουμε το OpenVPN 2.4.9 και το Easy-RSA 3.0.7.

$ sudo dnf install openvpn easy-rsa
  1. Στη συνέχεια, δημιουργούμε ως μη root έναν κατάλογο για το Easy RSA με όνομα Easy-RSA

$ mkdir ~/easyrsa
  1. Και συνδέστε το με το πακέτο Easy RSA που μόλις εγκαταστήσαμε

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

2. Δημιουργήστε ένα PKI για τον πελάτη OpenVPN#

Με τον ίδιο τρόπο που δημιουργήσαμε ένα PKI στον διακομιστή OpenVPN, θα δημιουργήσουμε ένα PKI χρησιμοποιώντας το Easy-RSA στην πλευρά του πελάτη.

3. Δημιουργήστε ένα client.req και client.key#

Με τον ίδιο τρόπο που εκδώσαμε το ζεύγος κλειδιών στο sever, δημιουργούμε ένα ζεύγος κλειδιών για τον πελάτη το οποίο θα αποτελείται από το αρχείο client.req και το αρχείο client.key. Το τελευταίο πρέπει να παραμείνει μυστικό στη μηχανή του πελάτη.

4. Υπογράψτε client.req και εκδώστε το αρχείο client.crt.#

Για να μεταφέρουμε το αρχείο client.req στη μηχανή CA, θα χρησιμοποιήσουμε την ίδια μέθοδο που χρησιμοποιήσαμε για το αρχείο server.req.

Μόλις μεταφερθεί, στο μηχάνημα της CA υπογράφουμε το αρχείο αίτησης υπογραφής πιστοποιητικού με την ακόλουθη εντολή

$ 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. Εισαγωγή client.crt στο Nitrokey από το μηχάνημα CA#

Αφού δημιουργήσουμε το αρχείο client.crt, συνδέουμε τη συσκευή Nitrokey Pro 2 στο μηχάνημα CA και εισάγουμε το αρχείο .crt στη συσκευή Pro 2 χρησιμοποιώντας αυτή την εντολή:

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

Μπορείτε να δείτε αν το κλειδί έχει αποθηκευτεί αποτελεσματικά στο Nitrokey χρησιμοποιώντας αυτή την εντολή:

$ pkcs15-tool -c

Ή εναλλακτικά

$ pkcs11-tool --list-objects

Για περισσότερες εντολές μπορείτε να ανατρέξετε στο OpenSC wiki.

6. Ανακτήστε το αρχείο chain.crt από το μηχάνημα CA.#

Ενώ κρατάμε το αρχείο client.crtstored on the nitrokey Pro 2 device, we must retrieve the chain.crt στο μηχάνημα-πελάτη και το αποθηκεύουμε στον κατάλληλο κατάλογο. Μπορούμε να χρησιμοποιήσουμε scp όπως στη μέθοδο που εξηγείται στην ενότητα για τον διακομιστή του παρόντος οδηγού.

7. Διαμορφώστε τον πελάτη για να αλληλεπιδρά με το Nitrokey#

Τώρα, πίσω στο μηχάνημα-πελάτη, θα συνδέσουμε το Nitrokey Pro και θα το χρησιμοποιήσουμε για να δημιουργήσουμε τη σύνδεση VPN με το διακομιστή. Σε γενικές γραμμές, μια σύνδεση που χρησιμοποιεί TLS απαιτεί πολλαπλά πιστοποιητικά και κλειδιά για τον έλεγχο ταυτότητας:

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

Για αυτόν τον οδηγό μπορούμε να χρησιμοποιήσουμε το ακόλουθο αρχείο client.conf και να προσθέσουμε τις απαιτούμενες επιλογές ανάλογα:

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. Προσδιορίστε το σωστό αντικείμενο

Κάθε πάροχος PKCS#11 μπορεί να υποστηρίζει πολλαπλές συσκευές. Για να δείτε τη λίστα των διαθέσιμων αντικειμένων μπορείτε να χρησιμοποιήσετε την ακόλουθη εντολή:

$ 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

Κάθε ζεύγος πιστοποιητικού/ιδιωτικού κλειδιού έχει μοναδική συμβολοσειρά Serialized id. Η σειριακή συμβολοσειρά id του ζητούμενου πιστοποιητικού θα πρέπει να καθοριστεί, στο αρχείο ρυθμίσεων. Μπορούμε να το κάνουμε αυτό προσθέτοντας την επιλογή pkcs11-id χρησιμοποιώντας απλά εισαγωγικά.

pkcs11-id 'pkcs11:model=pkcs11:model=PKCS%NNNN%20emulated;token=User%20PIN%20%28OpenPGP%20card%29;manufacturer=ZeitControl;serial=000NNNNNN;id=%03'
  1. Προσθέστε το ανακτηθέν Serialized ID στο αρχείο ρυθμίσεων

Χρησιμοποιώντας τον αγαπημένο σας επεξεργαστή κειμένου, ανοίξτε το αρχείο server.conf και προσθέστε τις ακόλουθες γραμμές, φροντίζοντας να εισάγετε τις δικές σας 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, μπορείτε επίσης να προσθέσετε μερικές γραμμές για να χειριστείτε τη διαχείριση κλειδιών, αν και είναι προαιρετική.

Σημείωση

Κάντε κλικ για να δείτε τον κωδικό

# 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

Προαιρετικό βήμα

Εάν πρέπει να δοκιμάσετε τη διαμόρφωση, με και χωρίς το token στο Nitrokey, μπορείτε να προσθέσετε γραμμές στο ίδιο client.conf και να σχολιάσετε/αποσχολιάσετε τις σχετικές γραμμές ανάλογα με τις ανάγκες σας:

Σημείωση

Κάντε κλικ για να δείτε τον κωδικό

# non_nitrokey login

# cert client.crt
# key client.key
# tls-auth ta.key 1
  1. Διαμόρφωση του πελάτη OpenVPN

Το τελικό αρχείο ρυθμίσεων client.conf θα πρέπει να μοιάζει με αυτό:

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. Γνωστά ζητήματα

Υπάρχουν ορισμένα γνωστά προβλήματα που σχετίζονται με τη σύνδεση στο OpenVPN με το OpenSC. Παρακαλούμε συμβουλευτείτε αυτά τα θέματα εδώ.

8. Εκκινήστε τον πελάτη OpenVPN#

  1. Εκκινήστε την υπηρεσία OpenVPN στον υπολογιστή-πελάτη

Ενεργοποιήστε την υπηρεσία OpenVPN και εκκινήστε την χρησιμοποιώντας αυτές τις εντολές:

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

Για να ελέγξετε ξανά αν η υπηρεσία OpenVPN είναι ενεργή, χρησιμοποιήστε αυτήν την εντολή:

$ sudo systemctl status openvpn-server@server.service
  1. Εισάγετε το PIN χρήστη σας

Κατά την εκτέλεση του προγράμματος-πελάτη OpenVPN, πρέπει να εισαχθεί το 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: ******

Προειδοποίηση

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)

Σε ορισμένες αναφερθείσες περιπτώσεις δεν ζητείται PIN στο τερματικό. Μια λύση θα ήταν να χρησιμοποιήσετε αυτή την εντολή για να συνδεθείτε με το PIN:

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

Εναλλακτικά, θα μπορούσατε να αναμεταγλωττίσετε τον πελάτη OpenVPN με απενεργοποιημένη την υποστήριξη systemd, και θα σας ζητήσει το PIN όπως αναμένεται.

Μια άλλη επιλογή θα ήταν να συνδεθείτε στο OpenVPN με τον πελάτη Viscosity, ο οποίος παρέχει καλύτερη εμπειρία χρήσης, ειδικά για την εισαγωγή του PIN.