PKCS#11 με το pkcs11-tool#
Αυτός ο οδηγός περιγράφει τη χρήση του προγράμματος οδήγησης PKCS#11 για το NetHSM. Ο οδηγός χρησιμοποιεί εργαλεία από το OpenSC. Ανατρέξτε στην τεκμηρίωσή τους για να μάθετε πώς να τα χρησιμοποιείτε στο λειτουργικό σας σύστημα.
Σημαντικό
Αυτό το πρόγραμμα οδήγησης είναι ακόμα μια πρώιμη υλοποίηση Proof of Concept που υλοποιεί μόνο τις λειτουργίες που είναι απαραίτητες για τη λειτουργία διακομιστών TLS.
Εγκατάσταση#
Εγκαταστήστε την προμεταγλωττισμένη βιβλιοθήκη#
Κατεβάστε ένα αρχείο με την τελευταία έκδοση από τη σελίδα releases του αποθετηρίου. Χρησιμοποιήστε το αρχείο έκδοσης που περιέχει στον τίτλο το όνομα του λειτουργικού σας συστήματος.
Εξαγάγετε τα αρχεία από το αρχείο που κατεβάσατε με ένα πρόγραμμα αρχειοθέτησης της επιλογής σας.
Αντιγράψτε την εξαχθείσα βιβλιοθήκη στην αντίστοιχη διαδρομή στο λειτουργικό σας σύστημα. Η διαδρομή εξαρτάται από την εγκατάσταση και τη διαμόρφωση του OpenSC.
Μεταγλώττιση από τον πηγαίο κώδικα#
Σημαντικό
Αυτός ο οδηγός μπορεί να μεταγλωττιστεί μόνο με τον επίσημο μεταγλωττιστή Go. Μην χρησιμοποιείτε τον μεταγλωττιστή GNU Go (GCC-Go). Παρακαλούμε ανατρέξτε στον ιστότοπό τους ` <https://go.dev/doc/install>` __ για να μάθετε πώς να τον εγκαταστήσετε.
Κατεβάστε ένα αρχείο με την τελευταία έκδοση από τη σελίδα releases του αποθετηρίου. Χρησιμοποιήστε το αρχείο έκδοσης που περιέχει στον τίτλο το Source code.
Εξαγάγετε τα αρχεία από το αρχείο που κατεβάσατε με ένα πρόγραμμα αρχειοθέτησης της επιλογής σας.
Στον κατάλογο με τον εξαχθέντα πηγαίο κώδικα εκτελέστε την ακόλουθη εντολή για να μεταγλωττίσετε τη βιβλιοθήκη.
./build.sh
./build.sh
Αντιγράψτε την εξαχθείσα βιβλιοθήκη στην αντίστοιχη διαδρομή στο λειτουργικό σας σύστημα. Η διαδρομή εξαρτάται από την εγκατάσταση και τη διαμόρφωση του OpenSC.
Διαμόρφωση#
Το αρχείο ρυθμίσεων p11nethsm.conf απαιτείται και χρησιμοποιείται για τη διαμόρφωση της σύνδεσης μεταξύ του προγράμματος οδήγησης PKCS#11 και του NetHSM.
Ένα παράδειγμα αρχείου ρυθμίσεων είναι το ακόλουθο.
YAML 1.1
---
p11nethsm:
logfile: /tmp/p11nethsm.log
maxsessioncount: 5
debug: true
slots:
- label: NetHSM1
description: NetHSM Zone A
url: "https://nethsmdemo.nitrokey.com/api/v1"
# certSHA256:
# - "0C:66:DC:EB:4D:12:C3:24:FC:82:F4:1D:4C:16:44:12:1D:00:79:FF:36:96:65:E2:21:C4:36:94:F7:8E:22:89"
user: "operator"
password: "env:NETHSM_PASS"
Τροποποιήστε το αρχείο ρυθμίσεων p11nethsm.conf σύμφωνα με το περιβάλλον σας.
Το αρχείο ρυθμίσεων μπορεί να περιλαμβάνει πολλαπλές υποδοχές, μέσα στον πίνακα slots. Οι υποδοχές αντιπροσωπεύουν πολλαπλές εγκαταστάσεις NetHSM. Το πεδίο label μιας υποδοχής πρέπει να περιέχει ένα μοναδικό όνομα. Τα κλειδιά url, user και password είναι υποχρεωτικά. Για λόγους ασφαλείας συνιστάται να περνάτε τον κωδικό πρόσβασης σε μια μεταβλητή περιβάλλοντος. Για το σκοπό αυτό το env:NETHSM_PASS περνάει στο κλειδί password, όπου NETHSM_PASS είναι το όνομα της μεταβλητής περιβάλλοντος που περιέχει τον κωδικό πρόσβασης. Το κλειδί certSHA256 πρέπει να οριστεί εάν το πιστοποιητικό TLS δεν είναι υπογεγραμμένο από μια Αρχή Πιστοποιητικών (CA) που περιέχεται στην αποθήκη πιστοποιητικών του λειτουργικού συστήματος.
Το αρχείο ρυθμίσεων πρέπει να αποθηκευτεί είτε στις ακόλουθες διαδρομές είτε στον κατάλογο στον οποίο εκτελείται η εφαρμογή.
$HOME/.nitrokey
/etc/nitrokey/
Διαχείριση κλειδιών#
Πληροφορίες#
Εμφάνιση πληροφοριών σχετικά με την έκδοση του cryptoki και το πρόγραμμα οδήγησης PKCS#11.
$ pkcs11-tool --module p11nethsm.so --show-info
Cryptoki version 2.40
Manufacturer Nitrokey GmbH
Library NetHSM PKCS#11 module (ver 0.1)
Using slot 0 with a present token (0x0)
Λίστα Κουλοχέρηδων#
Οι πληροφορίες σχετικά με τις διαθέσιμες υποδοχές. Οι αναφερόμενες υποδοχές εξαρτώνται από τη διαμόρφωση της συστοιχίας υποδοχών στο αρχείο διαμόρφωσης p11nethsm.conf. Για να μάθετε περισσότερα σχετικά με τη διαμόρφωση των slots, ανατρέξτε στο κεφάλαιο Διαμόρφωση.
$ pkcs11-tool --module p11nethsm.so --list-slots
Available slots:
Slot 0 (0x0): NetHSM Zone A
token label : NetHSM1
token manufacturer : Nitrokey GmbH
token model : NetHSM
token flags : rng, token initialized, PIN initialized, readonly
hardware version : 0.1
firmware version : 0.1
serial num : 0
pin min/max : 3/256
Σημείωση
Αν η διαμόρφωσή σας υποστηρίζει περισσότερες από μία υποδοχές, ίσως χρειαστεί να προσθέσετε την επιλογή –slot <arg> στις εντολές του pkcs11-tool για να χρησιμοποιήσετε τη σωστή.
Δημιουργία κλειδιού#
Δημιουργήστε ένα ζεύγος κλειδιών και αποθηκεύστε το στο NetHSM.
Σημείωση
Το πρόγραμμα οδήγησης PKCS#11 δεν υποστηρίζει επί του παρόντος αυτή τη λειτουργία. Ένα ζεύγος κλειδιών μπορεί να δημιουργηθεί με το nitropy ή με ένα αίτημα REST API. Για να μάθετε περισσότερα σχετικά με τον τρόπο δημιουργίας ενός κλειδιού, ανατρέξτε στο κεφάλαιο Generate Key.
Λίστα κλειδιών#
Εμφάνιση πληροφοριών σχετικά με τα κλειδιά και τα πιστοποιητικά στο Key Store σε ένα NetHSM.
$ pkcs11-tool --module p11nethsm.so --list-objects
Using slot 0 with a present token (0x0)
Private Key Object; RSA
label: myFirstKey
ID: 6d7946697273744b6579
Usage: decrypt, sign
Access: sensitive, always sensitive, never extractable
Public Key Object; RSA 0 bits
label: myFirstKey
ID: 6d7946697273744b6579
Usage: none
Access: none
Διαβάστε τα κλειδιά#
Ανάγνωση κλειδιών και πιστοποιητικών από το Key Store σε ένα NetHSM. Δεν είναι δυνατή η ανάγνωση ιδιωτικών κλειδιών από το NetHSM.
Το δημόσιο κλειδί ενός ζεύγους κλειδιών μπορεί να διαβαστεί ως εξής.
$ pkcs11-tool --module p11nethsm.so --read-object --type pubkey --label myFirstKey -o public.key
Το πιστοποιητικό ενός ζεύγους κλειδιών μπορεί να διαβαστεί ως εξής.
$ pkcs11-tool --module p11nethsm.so --read-object --type cert --label myFirstKey -o public.key
Τα επιστρεφόμενα πιστοποιητικά ή δημόσια κλειδιά είναι κωδικοποιημένα σε ASN.1. Τα δεδομένα μπορούν να αποκωδικοποιηθούν με το εργαλείο dumpasn1, καθώς περιέχουν δεδομένα σε μορφή DER. Η μορφή DER μπορεί να μετατραπεί σε μορφή PEM με το OpenSSL.
Γράψτε τα πλήκτρα#
Εγγραφή κλειδιών και πιστοποιητικών στο Key Store σε ένα NetHSM.
Το ιδιωτικό κλειδί ενός ζεύγους κλειδιών μπορεί να γραφτεί ως εξής.
$ pkcs11-tool --module p11nethsm.so --write-object secret.key --type privkey --label myFirstKey
Το δημόσιο κλειδί ενός ζεύγους κλειδιών μπορεί να γραφτεί ως εξής.
$ pkcs11-tool --module p11nethsm.so --write-object public.key --type pubkey --label myFirstKey
Το πιστοποιητικό ενός ζεύγους κλειδιών μπορεί να γραφτεί ως εξής.
$ pkcs11-tool --module p11nethsm.so --write-object cert.pub --type cert --label myFirstKey
Βασικές λειτουργίες#
Κρυπτογράφηση#
Το NetHSM δεν μπορεί να κρυπτογραφήσει δεδομένα με ασύμμετρα κλειδιά, αλλά παρέχει το δημόσιο κλειδί που μπορεί να χρησιμοποιηθεί για κρυπτογράφηση. Ανατρέξτε στο κεφάλαιο Εμφάνιση λεπτομερειών κλειδιού, ή ανακτήστε το κλειδί όπως περιγράφεται στο κεφάλαιο Ανάγνωση κλειδιών <pkcs11_with_pkcs11.html#read-keys>, για να μάθετε περισσότερα σχετικά με τον τρόπο ανάκτησης του δημόσιου κλειδιού. Το παράδειγμα υποθέτει ότι το δημόσιο κλειδί βρίσκεται στο αρχείο public.pem.
Τα δεδομένα μπορούν να κρυπτογραφηθούν με το OpenSSL ως εξής.
$ echo 'NetHSM rulez!' | openssl pkeyutl -encrypt -pubin \
-inkey public.pem \
-pkeyopt rsa_padding_mode:oaep \
-pkeyopt rsa_oaep_md:sha512 \
-pkeyopt rsa_mgf1_md:sha512 \
-out encrypted.data
Αποκρυπτογράφηση#
Το NetHSM μπορεί να αποκρυπτογραφήσει δεδομένα για ένα ιδιωτικό κλειδί που είναι αποθηκευμένο στο Key Store στο NetHSM. Αυτό το παράδειγμα χρησιμοποιεί το κρυπτογραφημένο μήνυμα από το προηγούμενο κεφάλαιο Κρυπτογράφηση.
$ pkcs11-tool --module p11nethsm.so --decrypt \
--mechanism RSA-PKCS-OAEP \
--input-file encrypted.data \
--label myFirstKey \
--hash-algorithm SHA512
NetHSM rulez!
Υπογράψτε#
Το NetHSM μπορεί να υπογράψει δεδομένα για ένα ιδιωτικό κλειδί που είναι αποθηκευμένο στο Key Store στο NetHSM. Για υπογραφές με κλειδί RSA και ECDSA, πρέπει πρώτα να υπολογιστεί ένα digest.
Για τον υπολογισμό μιας σύνοψης απαιτούνται πρώτα τα δεδομένα. Ένα μήνυμα δημιουργείται ως εξής.
$ echo 'NetHSM rulez!' | pkcs11-tool --module p11nethsm.so \
--sign \
--mechanism SHA512-RSA-PKCS-PSS \
--output-file sig.data \
--label myFirstKey
Η υπογραφή που δημιουργήθηκε μπορεί να επαληθευτεί με το OpenSSL ως εξής.
$ echo 'NetHSM rulez!' | openssl dgst -keyform PEM \
-verify public.pem \
-sha512 \
-sigopt rsa_padding_mode:pss \
-sigopt rsa_pss_saltlen:-1 \
-signature sig.data