Διαμόρφωση OpenVPN με το Easy-RSA¶
✓ |
⨯ |
⨯ |
⨯ |
⨯ |
✓ |
✓ |
✓ |
Σημείωση
Αυτός ο οδηγός είναι σε εξέλιξη και θα ενημερώνεται ανάλογα. Παρακαλούμε να λάβετε υπόψη αυτή την κατάσταση.
Αυτός ο οδηγός δείχνει πώς να ρυθμίζετε τους πελάτες OpenVPN ώστε να συνδέονται χρησιμοποιώντας ένα Nitrokey Pro 2 ή ένα Nitrokey Storage 2. Για τη διαχείριση κλειδιών λογισμικού θα χρησιμοποιήσουμε το Easy-RSA, ένα βοηθητικό πρόγραμμα που εξελίσσεται παράλληλα με το 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).
Θα χρησιμοποιήσουμε το 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¶
Πρώτα πρέπει να ενεργοποιήσουμε την προώθηση IP με την επεξεργασία του αρχείου
/etc/sysctl.conf
.$ editor /etc/sysctl.confΑποσχολιάστε ή επεξεργαστείτε αναλόγως την ακόλουθη γραμμή
net.ipv4.ip_forward=1Κλείστε το μετά την αποθήκευση και εισαγάγετε αυτή την εντολή
$ sysctl -pΜόλις γίνει η προώθηση IP, θα πρέπει να κατεβάσουμε την τελευταία έκδοση του OpenvPN για τον διακομιστή μας Debian 10, σύμφωνα με τις αυτές τις οδηγίες:
Αλλάξτε σε root και κατεβάστε το κλειδί GPG που υπέγραψε το πακέτο
$ sudo -s # wget -O - https://swupdate.openvpn.net/repos/repo-public.gpg|apt-key add -Προσθέστε τη διεύθυνση 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, καθώς το «password prompt» απαιτεί τουλάχιστον OpenVPN έκδοση 2.4.8 για να συνδεθείτε.
Στη συνέχεια κατεβάζουμε το 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
και στη συνέχεια επικολλήστε τον στην ακόλουθη εντολή:
Κατεβάστε την τελευταία έκδοση
$ cd ~ $ wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.7/EasyRSA-3.0.7.tgzΑποσυμπιέστε το 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
με ορισμένες προεπιλεγμένες τιμές.
Δημιουργήστε ένα αρχείο
vars
.$ touch ~/easyrsa/vars $ cd easyrsa/ $ editor varsΜόλις ανοίξετε το αρχείο, επικολλήστε τις ακόλουθες δύο γραμμές
set_var EASYRSA_ALGO "ec" set_var EASYRSA_DIGEST "sha512"Αυτές είναι οι μόνες δύο γραμμές που χρειάζεστε σε αυτό το αρχείο
vars
στον διακομιστή OpenVPN, καθώς δεν θα χρησιμοποιηθεί ως Αρχή Πιστοποιητικών. Θα διασφαλίσουν ότι τα ιδιωτικά σας κλειδιά και τα αιτήματα πιστοποιητικών έχουν ρυθμιστεί ώστε να χρησιμοποιούν κρυπτογραφία ελλειπτικής καμπύλης (ECC) για τη δημιουργία κλειδιών και ασφαλών υπογραφών για τους πελάτες σας και τον διακομιστή OpenVPN.Όσον αφορά την επιλογή των κρυπτογραφικών αλγορίθμων, ακολουθώ το μοντέλο του αυτού του σεμιναρίου, και μπορείτε να τα προσαρμόσετε ανάλογα με τις δικές σας ανάγκες.
Αρχικοποίηση του PKI
Μόλις συμπληρώσετε το αρχείο
vars
μπορείτε να προχωρήσετε στη δημιουργία του καταλόγου PKI. Για να το κάνετε αυτό, εκτελέστε το σενάριο easyrsa με την επιλογή init-pki:$ ./easyrsa init-pkiΑφού αρχικοποιήσετε το PKI σας στο διακομιστή OpenVPN, είστε έτοιμοι να προχωρήσετε στο επόμενο βήμα, που είναι η δημιουργία αίτησης πιστοποιητικού διακομιστή OpenVPN και ιδιωτικού κλειδιού.
4. Δημιουργήστε server.req
και server.key
¶
Τώρα που ο διακομιστής σας OpenVPN έχει εγκαταστήσει όλα τα προαπαιτούμενα, το επόμενο βήμα είναι να δημιουργήσετε ένα ζεύγος κλειδιών που αποτελείται από ένα ιδιωτικό κλειδί (το οποίο πρέπει να κρατήσετε μυστικό) και ένα αίτημα υπογραφής πιστοποιητικού (
.csr
) στον διακομιστή σας OpenVPN.Σε γενικές γραμμές, στα συστήματα όπου δημιουργούμε ένα κλειδί και ένα αίτημα, τα αρχεία αυτά αφήνονται μη κρυπτογραφημένα με τη χρήση του επιχειρήματος
nopass
, δεδομένου ότι οι διακομιστές πρέπει συνήθως να ξεκινούν χωρίς την εισαγωγή κωδικού πρόσβασης. Αυτό δημιουργεί ένα αποκρυπτογραφημένο κλειδί, οπότε προσέξτε προστατεύστε προσεκτικά την πρόσβαση και τα δικαιώματα πρόσβασης σε αρχεία.Πρακτική συμβουλή
Σημειώσεις διαμόρφωσης από το OpenVPN:
- The server, and each client, must have their own cert and key
file. The server and all clients will use the same CA file.
Το πιστοποιητικό διακομιστή πρέπει να έχει τα εξής:
keyUsage: digitalSignature, keyEncipherment
extendedKeyUsage: serverAuth
Δημιουργήστε την αίτηση υπογραφής για το διακομιστή
Πλοηγηθείτε στον κατάλογο
~/easyrsa
στον διακομιστή OpenVPN ως χρήστης που δεν είναι root και εισαγάγετε τις ακόλουθες εντολές:$ cd easyrsa/ $ ./easyrsa gen-req server nopassΑυτό θα δημιουργήσει ένα ιδιωτικό κλειδί για τον διακομιστή και ένα αρχείο αίτησης πιστοποιητικού με όνομα
server.req
.Μόλις αποκτήσετε ένα υπογεγραμμένο πιστοποιητικό, θα το μεταφέρετε πίσω στον διακομιστή OpenVPN.
Αντιγράψτε το κλειδί στον κατάλογο του διακομιστή 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.req
(ήserver.csr
) στο σύστημα CA.Η ίδια η μεταφορά δεν είναι ευαίσθητη στην ασφάλεια, αν και είναι συνετό να επαληθεύετε αν το αρχείο που λαμβάνετε ταιριάζει με το αντίγραφο του αποστολέα, αν η μεταφορά δεν είναι αξιόπιστη.
Για να προχωρήσω σε αυτά τα βήματα, θα βασιστώ εκτενώς στις αυτές τις οδηγίες, για να υπογράψω τις αιτήσεις υπογραφής πιστοποιητικών, αφού τις δημιουργήσουμε με το Easy-RSA.
Υπογράψτε το αρχείο
server.req
Στο τοπικό μηχάνημα που προορίζεται για την πρόσβαση στο HSM, θα χρησιμοποιήσουμε τα εργαλεία που παρέχει το Opensc 0.20 για να υπογράψουμε το αρχείο
.req
και να το στείλουμε πίσω στον διακομιστή OpenVPN. Υποθέτουμε ότι έχουμε μεταφέρει το αρχείο από το μηχάνημα του διακομιστή στο μηχάνημα της CA.Αρχικά ξεκινάμε συνδέοντας το HSM Nitrokey και εισάγουμε αυτή την εντολή για την απαρίθμηση των διαθέσιμων πλήκτρων.
Αναζήτηση της λίστας των διαθέσιμων συσκευών
$ p11tool --list-all(Υποχρεωτικό βήμα) Εάν είναι η πρώτη φορά που υπογράφετε ένα πιστοποιητικό με την CA, ίσως θελήσετε να ανακτήσετε το URI του ιδιωτικού κλειδιού της CA από το HSM και να το συμπεριλάβετε στο αρχείο ρυθμίσεων.
Σημείωση
Το 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Δημιουργήστε τον κατάλογο
openvpn/
κάτω από τον κατάλογοcertificate-authority/
$ mkdir/opt/certificate-authority/ $ cd /opt/certificate-authority/Υπογράψτε το
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Ανάκτηση του αρχείου
server.crt
στο μηχάνημα του διακομιστή
Μεταφορά των υπογεγραμμένων πιστοποιητικών στο διακομιστή
Από το μηχάνημα CA, αντιγράψτε τα αρχεία
server.crt
καιchain.crt
στο διακομιστή OpenVPN. Σε αυτό το παράδειγμα θα χρησιμοποιήσουμε την εντολήscp
ως εξής:$ scp openvpn/{server.crt,chain.crt} admin@your_openvpnserver_ip:/tmpΤοποθετήστε τα πιστοποιητικά στον κατάλογο του διακομιστή
$ 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. Εγκαταστήστε το OpenVPN και το Easy-RSA¶
Εγκαταστήστε το λογισμικό
Μπορούμε να χρησιμοποιήσουμε απευθείας
dnf install
για να εγκαταστήσουμε το OpenVPN 2.4.9 και το Easy-RSA 3.0.7.$ sudo dnf install openvpn easy-rsaΣτη συνέχεια, δημιουργούμε ως μη root έναν κατάλογο για το Easy RSA με όνομα
Easy-RSA
$ mkdir ~/easyrsaΚαι συνδέστε το με το πακέτο 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.¶
While we keep the
client.crt
stored on the nitrokey Pro 2 device, we must retrieve thechain.crt
file on the client machine, and store it in the adequate directory. We may usescp
as in the method explained in the server section of this guide.
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
Προσδιορίστε το σωστό αντικείμενο
Κάθε πάροχος 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'Προσθέστε το ανακτηθέν 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Διαμόρφωση του πελάτη 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 1Configure OpenVPN (Windows only)
Για να δημιουργήσετε μια χειραψία, πρέπει να ρυθμίσετε τις παραμέτρους του OpenSSL που περιλαμβάνεται στο OpenVPN.
Create the directory
ssl
inC:\Program Files\OpenVPN
and create fileopenssl.cnf
with the following content :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
Με αυτή την τροποποίηση, δεν θα έχετε σφάλμα όπως αναφέρεται εδώ, εδώ και εδώ
Γνωστά ζητήματα
Υπάρχουν ορισμένα γνωστά προβλήματα που σχετίζονται με την είσοδο στο OpenVPN με το OpenSC. Παρακαλούμε συμβουλευτείτε αυτά τα ζητήματα εδώ.
8. Εκκινήστε τον πελάτη OpenVPN¶
Εκκινήστε την υπηρεσία 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Εισάγετε το 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 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)Σε ορισμένες αναφερθείσες περιπτώσεις δεν ζητείται PIN στο τερματικό. Μια λύση θα ήταν να χρησιμοποιήσετε αυτή την εντολή για να συνδεθείτε με το PIN:
$ telnet 8888 password 'User PIN (OpenPGP card) token' <PIN>Εναλλακτικά, θα μπορούσατε να αναμεταγλωττίσετε τον πελάτη OpenVPN με απενεργοποιημένη την υποστήριξη systemd, και θα σας ζητήσει το PIN όπως αναμένεται.
Μια άλλη επιλογή θα ήταν να συνδεθείτε στο OpenVPN με τον πελάτη Viscosity, ο οποίος παρέχει καλύτερη εμπειρία χρήσης, ειδικά για την εισαγωγή του PIN.