{{tag>Brouillon Crypt Sécurité Matériel}} # Notes HSM Todo : * https://github.com/OpenSC/OpenSC/wiki/SmartCardHSM * https://www.smartcard-hsm.com/2014/09/25/Desaster_Recovery_for_your_SmartCard-HSM.html * https://raymii.org/s/articles/Storing_arbitraty_data_in_the_Nitrokey_HSM.html * http://stafwag.github.io/blog/blog/2015/11/21/starting-to-protect-my-private-keys-with-smartcard-hsm/ * https://curity.io/resources/learn/yubihsm-integration/ Matériel : * https://www.smartcard-hsm.com/ * Nitrokey HSM Logiciels : * hsmwiz * sc-hsm-tool * Pkcs11Admin * https://www.hohnstaedt.de/xca-doc/html/smartcard.html * https://www.smartcard-hsm.com/docs/SmartCard-HSM_XCA_Getting_Started.pdf Logiciel pour simuler une HSM * https://www.opendnssec.org/softhsm/ Tuto : * https://raymii.org/s/articles/Get_Started_With_The_Nitrokey_HSM.html * https://raymii.org/s/articles/Use_the_Nitrokey_HSM_or_SmartCard-HSM_with_sc-hsm-embedded_mod_nss_and_Apache_read_only_module.html * https://github.com/OpenSC/OpenSC/wiki/SmartCardHSM * https://www.smartcard-hsm.com/2015/10/10/Shared_Control_over_Key_Usage.html * https://doc.otrs.com/doc/manual/storm/8.0/en/content/hardware-security-module-for-pivate-keys.html * https://finalx.nl/en/authdns/master/hsm * https://embexus.com/category/security/ Voir aussi : * https://www.devever.net/~hl/smartcards * RSA / ECDSA / ECDH (no perfect forward secrecy) ~~~bash hsmwiz pkcs15-tool --dump opensc-explorer # Si KO faire : hsmwiz explorer ~~~ The DKEK must be set during initialization and before any other keys are generated. For a device initialized without a DKEK, keys can never be exported. ~~~bash #set +o history export HISTCONTROL = ignorespace pkcs11-tool --module /usr/local/lib/opensc-pkcs11.so --login --login-type so --so-pin 3537363231383830 --change-pin --new-pin 0123456789012345 ~~~ ~~~bash #set +o history export HISTCONTROL = ignorespace sc-hsm-tool --initialize --so-pin 3537363231383830 --pin 648219 --label "Nitrokey" ~~~ ~~~bash sc-hsm-tool --create-dkek-share dkek-share-1.pbe --pwd-shares-threshold 3 --pwd-shares-total 5 ~~~ Encrypting Files The device only supports asymmetric mechanisms. To do file encryption, you will need to generate AES keys locally, which you can encrypt with your RSA public key (this is how the Nitrokey storage key works); or by using ECDH to generate a shared secret from a locally generated public key ECDH Where possible, e.g. over networks, you should use ephemeral keys, to allow for perfect forward secrecy. Smartcard HSM’s ECDH is only useful when need to repeatedly retrieve the same shared secret, e.g. encrypting files in a hybrid cryptosystem. ## Notes ### pkcs15-init Please note, that the SmartCard-HSM is not compatible with the pkcs15-init command. In particular it does not support pkcs15-init to import a key from PKCS#12 files. Doing so will just create certificate objects and the private key metadata, but no key. Please use the Smart Card Shell to import keys and certificates from PKCS#12 files. Source: https://github.com/OpenSC/OpenSC/wiki/SmartCardHSM Semble contradictoire avec : * https://docs.nitrokey.com/hsm/linux/smime.html ## Initialisation / Réinitialiseation (Reset) Voir DKEK : Device Key Encryption Key ~~~bash sc-hsm-tool --initialize --so-pin 3537363231383830 --pin 648219 --dkek-shares 1 # Ou sc-hsm-tool --initialize --so-pin 3537363231383830 --pin 648219 --dkek-shares 2 ~~~ Test ~~~bash pkcs11-tool --test --login --pin 648219 ~~~ ~~~bash #set +o history export HISTCONTROL = ignorespace hsmwiz format --so-pin 3537363231383830 ~~~ Ou ~~~bash pkcs11-tool --init-token --init-pin --so-pin=3537363231383830 --label="test" --pin=648219 ~~~ ## Changer PIN Changer PIN / Débloquer carte ~~~bash #set +o history export HISTCONTROL = ignorespace pkcs11-tool --login --login-type so --so-pin=3537363231383830 --init-pin --new-pin=648219 ~~~ ## Génération d'une clef privée sur puce ~~~bash #set +o history export HISTCONTROL = ignorespace pkcs11-tool --pin=648219 --keypairgen --key-type rsa:4096 --label "Nom_Clef" ~~~ ~~~bash pkcs11-tool -l --keypairgen --key-type EC:secp521r1 --label root ~~~ ## Importer une clef privée existante TODO ## Exporter une clef publique ~~~bash pkcs15-tool -D pkcs15-tool --read-public-key 0988309300f4f26c1ff2279c09026490df89189e > publickey.pem ~~~ ## Chiffrer avec la clef publique ~~~bash # Depretated but work with ECC #openssl rsautl -inkey publickey.pem -pubin -encrypt -pkcs -in plop.txt -out plop.enc # Don't work with ECC openssl pkeyutl -inkey c_rsa.pub -pubin -encrypt -in plop.txt -out plop.enc ~~~ ### Pb ~~~ $ openssl pkeyutl -inkey c_ecc.pub -pubin -encrypt -in plop.txt -out plop.enc pkeyutl: Error initializing context C0E2525D567F0000:error:03000096:digital envelope routines:evp_pkey_asym_cipher_init:operation not supported for this keytype:../crypto/evp/asymcipher.c:189: ~~~ ## Déchiffrer avec la clef privée ~~~bash pkcs15-tool -D pkcs15-crypt --decipher --key f144aec7f488e2795069256c64fa27039c1a2ed2 --input plop.enc --pkcs1 --raw > plop.txt ~~~ ## Signer (RSA) ~~~bash pkcs11-tool --sign --id f144aec7f488e2795069256c64fa27039c1a2ed2 --mechanism RSA-PKCS --input-file plop.txt --output-file plop.txt.sig ~~~ ## Vérifier la signature (RSA) ~~~bash pkcs11-tool --verif --input-file plop.txt --mechanism RSA-PKCS --signature-file plop.txt.sig ~~~ ## Utiliser la clef privée pour se connecter en SSH Voir : * https://stafwag.github.io/blog/blog/2015/12/05/protecting-your-ssh-keys-with-smartcard-hsm/ * https://www.smartcard-hsm.com/2015/03/11/Using_the_SmartCard-HSM_with_SSH.html * https://jpmens.net/2021/06/16/ssh-with-a-smartcard-hsm/ * https://raymii.org/s/articles/Get_Started_With_The_Nitrokey_HSM.html ## Sauvegarder vos clefs privées en les exportant chiffrées Ne fonctionne que si vous avez * tous les fichiers nécessaire crées avec la commande ''sc-hsm-tool --create-dkek-share'' * Si vous avez la passphrase associée * Que si à l'initialisation vous avez utilisé l'option ''--dkek-shares 1'' lors de l'appel à ''sc-hsm-tool --initialize'' ~~~bash sc-hsm-tool --wrap-key wrap-key.bin --key-reference 1 --pin 648219 ~~~ ## Secrets partagés n-of-m Voir aussi [[Crypto - Découper ses clefs en plusieurs morceaux grâce au secret reparti]] Génération d'un DKEK ~~~bash sc-hsm-tool --create-dkek-share dkek-share-1.pbe --pwd-shares-threshold 3 --pwd-shares-total 5 ~~~ Importation d'un DKEK ~~~bash sc-hsm-tool --import-dkek-share dkek-share-1.pbe --pwd-shares-total 3 ~~~ ## Effacer une clef privée ~~~bash pkcs11-tool -l --delete-object --type privkey --id 0988309300f4f26c1ff2279c09026490df89189e pkcs11-tool -l --delete-object --type privkey --label 'RSAplop' ~~~ ## Importer un certificat dans la puce ~~~bash hsmwiz putcrt cert.pem ~~~ ## Déchiffrer les clefs privées Voir https://raymii.org/s/articles/Decrypt_NitroKey_HSM_or_SmartCard-HSM_private_keys.html ## Pb ### Unable to select file HHHH: Incorrect parameters in APDU ~~~ $ opensc-explorer OpenSC Explorer version 0.22.0 Using reader with a card: HID Global OMNIKEY 3x21 Smart Card Reader [OMNIKEY 3x21 Smart Card Reader] 00 00 OpenSC [3F00]> ls FileID Type Size Unable to select file 2F02: Incorrect parameters in APDU Unable to select file CE01: Incorrect parameters in APDU Unable to select file C401: Incorrect parameters in APDU Unable to select file CE02: Incorrect parameters in APDU Unable to select file C402: Incorrect parameters in APDU Unable to select file CC00: Incorrect parameters in APDU Unable to select file CC01: Incorrect parameters in APDU Unable to select file CC02: Incorrect parameters in APDU ~~~ #### Solution ~~~bash hsmwiz explore ~~~ -------------------------------- ~~~bash sc-hsm-tool --create-dkek-share dkek-share-alice.pbe sc-hsm-tool --create-dkek-share dkek-share-bob.pbe openssl base64 -in dkek-share-alice.pbe #set +o history export HISTCONTROL = ignorespace sc-hsm-tool --initialize --so-pin 3537363231383830 --pin=648219 --dkek-shares 2 sc-hsm-tool --import-dkek-share dkek-share-alice.pbe sc-hsm-tool --import-dkek-share dkek-share-bob.pbe ~~~ ~~~ Deciphering DKEK share, please wait... DKEK share imported DKEK shares : 2 DKEK key check value : 4A44853AAAF1253E ~~~ Générer une paire de clefs ~~~bash pkcs11-tool --pin=648219 --keypairgen --key-type rsa:2048 ~~~ Voir les clefs ~~~bash pkcs15-tool -D ~~~ Exporter la clef privée générée (chiffrée) ~~~bash #set +o history export HISTCONTROL = ignorespace sc-hsm-tool --wrap-key key-wrap.bin --key-reference 1 --pin=648219 ~~~ ### Importation carte backup ~~~bash sc-hsm-tool --import-dkek-share dkek-share-alice.pbe sc-hsm-tool --import-dkek-share dkek-share-bob.pbe #set +o history export HISTCONTROL = ignorespace sc-hsm-tool --unwrap-key key-wrap.bin --key-reference 1 --pin=648219 ~~~ = PKI ~~~bash pkcs11-tool -l --keypairgen --key-type EC:secp384r1 --label root ~~~ = Avoir des informations ~~~bash sc-hsm-tool pkcs15-tool -D pkcs11-tool -O --id 0 pkcs11-tool -O --id 0988309300f4f26c1ff2279c09026490df89189e ~~~ ---------- ## Autres ### CA https://docs.nitrokey.com/fr/hsm/mac/pkcs11-url.html ~~~bash pkcs15-init --delete-objects privkey,pubkey --id 3 --generate-key rsa/2048 --auth-id 3 --verify ~~~ https://docs.nitrokey.com/pro/linux/certificate-authority.html ~~~ pkcs11-tool -l --login-type so --keypairgen --key-type EC:brainpoolP512r1 --label root # --id 03 pkcs15-init --delete-objects privkey,pubkey --id 3 --generate-key EC:brainpoolP512r1 --auth-id 3 --verify ~~~ ~~~ $ pkcs11-tool -l --login-type so --keypairgen --key-type EC:brainpoolP512r1 --label root Using slot 0 with a present token (0x0) Logging in to "OpenPGP card (User PIN)". Please enter SO PIN: Key pair generated: Private Key Object; EC label: root ID: b92f272e911188b4d3ca4f60ded406635148f5cc Usage: sign, derive Access: none Public Key Object; EC EC_POINT 2044 bits EC_POINT: 048202002c67b8796615d8f7ade640464c12f398332fa304511baead446daf2c2666e4f6d11133caccbe3af21fad49a69d8a88f66bd5415020c51711dd0326535ab7d85ca084825cbbc6a10abae0084694e8e5b5c68a10da74bcf5d09ceb92915219a44429ae16012ee05517e44abe6abf45d071abc84f0ee4f28d1270b0c7672bb2892f9000000000000000410300000000000071924c5d05000000104021c9d455000031203831203034203243203637204238203739203636203135204438204637202e492e2e2e2e2e2e2c672e79662e2e2e0a4144204536203430203436203443203132204633203938203333203246204133203034203531203142204145204144202e2e40464c2e2e2e332f2e2e512e2e2e0a343420364420414620324320323620363620453420463620443120313120333320434120434320424520334120463220446d2e2c26662e2e2e2e332e2e2e3a2e0a3146204144203439204136203944203841203838204636203642204435203431203530203230204335203137203131202e2e492e2e2e2e2e6b2e4150202e2e2e0a4444203033203236203533203541204237204438203543204130203834203832203543204242204336204131203041202e2e26535a2e2e5c2e2e2e5c2e2e2e2e0a42412045302030382034362039342045382045352042352043362038412031302044412037342042432046 EC_PARAMS: 06092b240303020801010d label: root ID: b92f272e911188b4d3ca4f60ded406635148f5cc Usage: verify, derive Access: none ~~~ ~~~bash pkcs11-tool --list-objects --type cert --slot 1 pkcs11-tool --list-objects --type cert --slot 0 ~~~ = Autres ~~~bash #set +o history export HISTCONTROL = ignorespace pkcs11-tool --module opensc-pkcs11.so --login --pin 648219 --list-slots ~~~ Autres ~~~ opensc-tool --atr opensc-explorer --mf aid:E82B0601040181C31F0201 pkcs15-init --delete-objects privkey,pubkey --id 3 --store-private-key keyrsaplop --format pkcs12 --auth-id 3 --verify-pin pkcs11-tool -l --write-object keyrsaplop --type privkey --key-type RSA:3072 --pin 648219 --so-pin 3537363231383830 --login-type so --label "SSH" --usage-sign encrypt, verify sign openssl genrsa -out rsa2048 2048 ~~~ Autres ~~~ load("tools/explore.js"); load("tools/OutlineCore.js"); load("tools/CardOutlineFactory2.0.js"); Elliptic Curve private + public key pair for use with ES512 signatures: openssl ecparam -genkey -name secp521r1 -noout -out ec512-key-pair.pem openssl rsa -in key.pem -outform PEM -pubout -out public.pem openssl ec -in ec512-key-pair.pem -outform PEM -pubout -out public.pem $ openssl req -x509 -sha512 -days 365 -key ec512-key-pair.pem -in cert.csr -out certificate.pem Warning: No -copy_extensions given; ignoring any extensions in the request cat ec512-key-pair.pem certificate.pem > certificated-key.pem openssl pkcs12 -export -out keyStore.p12 -inkey ec512-key-pair.pem -in certificate.pem https://support.nitrokey.com/t/nitrokey-hsm-2-import-existing-private-and-public-keys-for-ecdsa/3072 hsmwiz putcrt keyStore.p12 ~~~