Prieiga prie „NetHSM“ naudojant REST API#

Šioje pamokoje parodyta, kaip pasiekti NetHMS per REST API. Sąsaja dokumentuojama čia, o jos specifikaciją galima rasti kaip RAML ir kaip OpenAPI (Swagger).

Pastaba

Jei naudojate NetHSM demonstracinį pavyzdį su savarankiškai pasirašytu sertifikatu, pavyzdžiui, naudodami „Docker“ atvaizdą, norėdami praleisti sertifikato patikrinimą, turėsite naudoti curl parinktį –insecure/-k.

Pastaba

Pirmiausia nustatykite $NETHSM_HOST reikšmę, kad ji būtų lygi jūsų NetHSM IP adresui arba URL. Mūsų demonstracinį serverį galima pasiekti adresu https://nethsmdemo.nitrokey.com/

Pirmiausia pažiūrėkime, ką čia turime:

$ curl -i -w '\n' https://$NETHSM_HOST/api/v1/info

HTTP/1.1 200 OK
content-length: 45
content-type: application/json
date: Mon, 25 Jan 2021 21:00:27 GMT
etag: "7bab62510e05c332735624bc7a585a30"
vary: Accept, Accept-Encoding, Accept-Charset, Accept-Language

{"vendor":"Nitrokey GmbH","product":"NetHSM"}

Pastaba

Pasirinktis -i/–include verčia curl spausdinti HTTP būsenos kodą ir atsakymo antraštes. Parinktis -w ‚n‘/–write-out ‚n‘ prideda naują eilutę po atsakymo kūno.

Pažiūrėkite, kokia yra prietaiso būsena:

$ curl -i -w '\n' https://$NETHSM_HOST/api/v1/health/state

HTTP/1.1 200 OK
cache-control: no-cache
content-length: 25
content-type: application/json
date: Mon, 25 Jan 2021 20:57:32 GMT
vary: Accept, Accept-Encoding, Accept-Charset, Accept-Language

{"state":"Unprovisioned"}

Inicializacija#

Pirmiausia naujam NetHSM reikia suteikti slaptažodžių frazes ir dabartinį laiką. Admin slaptažodis - tai Administrator slaptažodis, kuris yra vyriausiasis NetHSM naudotojas. Slaptažodis Unlock Passphrase naudojamas NetHSM konfidencialių duomenų Storagei užšifruoti.

Pastaba

NetHSM demonstracinė instancija adresu nethsmdemo.nitrokey.com jau sukurta.

$ curl -i -w '\n' -X POST https://$NETHSM_HOST/api/v1/provision \
-H "content-type: application/json" \
-d "{ adminPassphrase: \"adminPassphrase\", unlockPassphrase: \"unlockPassphrase\", \
systemTime: \"$(date --utc -Iseconds)\"}"

HTTP/1.1 204 No Content
cache-control: no-cache
content-type: application/json
date: Wed, 11 Nov 2020 16:35:44 GMT
vary: Accept, Accept-Encoding, Accept-Charset, Accept-Language

NetHSM galima naudoti Attended Boot ir Unattended Boot režimu.

  • Naudojant Attended Boot režimą, kiekvieno paleidimo metu reikia įvesti Unlock Passphrase, kuri naudojama duomenų Storagei užšifruoti. Saugumo sumetimais rekomenduojama naudoti šį režimą.

  • Naudojant Neprižiūrimo paleidimo režimą, atrakinimo slaptažodžio nereikia, todėl „NetHSM“ gali būti paleidžiamas be priežiūros, o duomenų Storage saugoma neužšifruota. Šį režimą naudokite, jei jūsų prieinamumo reikalavimų negalima įvykdyti naudojant Attended Boot režimą.

Gauti dabartinį režimą:

$ curl -i -w '\n' -u admin \
https://$NETHSM_HOST/api/v1/config/unattended-boot

HTTP/1.1 200 OK
content-length: 16
content-type: application/json
date: Wed, 21 Apr 2021 10:20:55 GMT
vary: Accept, Accept-Encoding, Accept-Charset, Accept-Language

{"status":"off"}

Perjunkite į Neprižiūrimo įkrovimo režimą:

$ curl -i -w '\n' -X PUT -H "content-type: application/json" \
https://$NETHSM_HOST/api/v1/config/unattended-boot -d "{ status: \"on\"}"

HTTP/1.1 204 No Content
content-type: application/json
date: Wed, 21 Apr 2021 10:24:25 GMT
vary: Accept, Accept-Encoding, Accept-Charset, Accept-Language

Arba grįžkite į Attended Boot režimą:

$ curl -i -w '\n' -u admin -X PUT -H "content-type: application/json" \
https://$NETHSM_HOST/api/v1/config/unattended-boot -d "{ status: \"off\"}"

HTTP/1.1 204 No Content
content-type: application/json
date: Wed, 21 Apr 2021 10:24:53 GMT
vary: Accept, Accept-Encoding, Accept-Charset, Accept-Language

Naudotojo valdymas#

Sukurti naudotoją#

Dabar sukurkite naują naudotoją su operatoriaus vaidmeniu, kuris gali būti naudojamas duomenims pasirašyti ir iššifruoti. Atkreipkite dėmesį, kad NetHSM priskiria atsitiktinį naudotojo ID, jei jo nenurodome.

$ curl -i -w '\n' -u admin \
"https://$NETHSM_HOST/api/v1/users/operator" -X PUT \
-H "content-type: application/json" -d "{\"realName\": \"Jane User\", \
\"role\": \"Operator\", \"passphrase\": \"opPassphrase\"}"

HTTP/1.1 201 Created
content-length: 0
content-type: application/json
date: Wed, 21 Apr 2021 10:25:27 GMT
location: /api/v1/users/operator
vary: Accept, Accept-Encoding, Accept-Charset, Accept-Language

Raktų valdymas#

NetHSM palaiko RSA, ED25519 ir ECDSA raktus. Kurdami raktą, turite pasirinkti ir rakto algoritmą, ir naudojamus rakto mechanizmus. RSA raktai gali būti naudojami dešifravimui (su režimais raw, PKCS#1 ir OAEP su MD5, SHA1, SHA224, SHA256, SHA384 arba SHA512) ir pasirašymui (su režimais PKCS#1 ir PSS su MD5, SHA1, SHA224, SHA256, SHA384 arba SHA512). Kiti algoritmai palaiko tik parašo mechanizmą.

Išsamų galimų raktų algoritmų ir raktų mechanizmų sąrašą rasite API dokumentuose, skirtuose KeyAlgorithm ir KeyMechanism tipams.

Generuoti raktus#

Šiame skyriuje norime naudoti RSA raktą duomenims iššifruoti, naudodami PKCS#1, ir duomenims pasirašyti su PSS, naudodami SHA256. Taigi sukurkime naują raktą NetHSM. Įsitikinkite, kad naudojate RSA algoritmą ir pasirinkote RSA_Signature_PSS_SHA256 ir RSA_Decryption_PKCS1 raktų mechanizmus. Jei nenurodysite rakto ID, „NetHSM“ sugeneruos atsitiktinį naujojo rakto ID.

$ curl -i -w '\n' -u admin -X POST \
https://$NETHSM_HOST/api/v1/keys/generate -H "content-type: application/json" \
-d "{ \"mechanisms\": [ \"RSA_Signature_PSS_SHA256\", \"RSA_Decryption_PKCS1\" ], \
\"type\": \"RSA\",  \"length\": 2048,  \"id\": \"myFirstKey\"}"

HTTP/1.1 201 Created
cache-control: no-cache
content-length: 0
content-type: application/json
date: Tue, 26 Jan 2021 05:54:09 GMT
location: /api/v1/keys/0ead0d9dd849cecf845c
vary: Accept, Accept-Encoding, Accept-Charset, Accept-Language

Importo raktai#

Užuot generavę raktą „NetHSM“, taip pat galite importuoti esamus privačius raktus į „NetHSM“:

$ curl -i -w '\n' -u admin -X PUT \
https://$NETHSM_HOST/api/v1/keys/mySecondKey -H "content-type: application/json" \
-d "{ \"mechanisms\": [ \"RSA_Signature_PSS_SHA256\", \"RSA_Decryption_PKCS1\" ], \
\"type\": \"RSA\",  \"key\": {\"primeP\": \"AOnWFZ+JrI/xOXJU04uYCZOiPVUWd6CSbVseEYrYQYxc7dVroePshz29tc+VEOUP5T0O8lXMEkjFAwjW6C9QTAsPyl6jwyOQluMRIkdN4/7BAg3HAMuGd7VmkGyYrnZWW54sLWp1JD6XJG33kF+9OSar9ETPoVyBgK5punfiUFEL\", \"primeQ\": \"ANT1kWDdP9hZoFKT49dwdM/S+3ZDnxQa7kZk9p+JKU5RaU9e8pS2GOJljHwkES1FH6CUGeIaUi81tRKe2XZhe/163sEyMcxkaaRbBbTc1v6ZDKILFKKt4eX7LAQfhL/iFlgi6pcyUM8QDrm1QeFgGz11ChM0JuQw1WwkX06lg8iv\", \"publicExponent\": \"AQAB\"}}"

HTTP/1.1 204 No Content
content-type: application/json
date: Wed, 21 Apr 2021 10:37:23 GMT
vary: Accept, Accept-Encoding, Accept-Charset, Accept-Language

Sąrašo raktai#

Norėdami įsitikinti, ar raktas sukurtas ir ar jame nustatyti teisingi algoritmo ir mechanizmo nustatymai, galime pateikti užklausą visiems NetHSM raktams:

$ curl -i -w '\n' -u admin
HTTP/1.1 200 OK
content-length: 39
content-type: application/json
date: Tue, 26 Jan 2021 05:56:24 GMT
etag: "34353234366432333063663739313939346635316666343937333564653434333937613237626139"
vary: Accept, Accept-Encoding, Accept-Charset, Accept-Language

[{"key":"myFirstKey"},{"key":"mySecondKey"}]

Rodyti informaciją apie raktą#

Taip pat galime pateikti užklausą apie sukurtos raktų poros viešąjį raktą:

$ curl -s -w '\n' -u admin https://$NETHSM_HOST/api/v1/keys/myFirstKey

{"mechanisms":["RSA_Decryption_PKCS1","RSA_Signature_PSS_SHA256"],"type":"RSA","modulus":"td583uBYRfO7qtvPoQF7liUh8gq3zckCk9LpCfblx2S0HdOvButfD4TyH4EMiZj3NhEoq18BZhqhxTL22UyNJwYJd2tCF4EbgTaj/Z3LeCPoGN5LjadFCsYriPeHsdnuLmTK6KsmTAP/CWJ+u3LesU5bCGWbDnPjv2WaLTeiMuNw1347gj1drft8jFA9SmOFjZxM9pq2Hk1nQSYpeAPCnigC7hLwAWgzKqVQv/J7VVWat3ke/jOrxFiRDFIeC3qxtBs6T7GYwqmsxkxgqKDljTAH4qMrC9vgVbbFPffe8UgmtDfvQ0ghP57b3HYZDON90MJ2qrU944E74g+ua6unTw==","publicExponent":"AQAB","operations":0}

Kad raktą galėtume naudoti su OpenSSL, eksportuojame jį kaip PEM failą ir saugome kaip public.pem:

$ curl -u operator -X GET \
https://$NETHSM_HOST/api/v1/keys/myFirstKey/public.pem -o public.pem

Raktą galime patikrinti su „OpenSSL“ ir naudoti šifravimui arba parašo tikrinimui (kaip aprašyta kitame skyriuje):

$ openssl rsa -in public.pem -pubin -text

RSA Public-Key: (2048 bit)
Modulus:
    00:c3:56:f5:09:cc:a9:3e:ca:16:2e:fb:d2:8b:9d:
    a9:33:5a:87:8f:3f:7a:bb:8a:3d:62:9b:5d:56:84:
    95:97:bb:97:f0:77:e2:c8:59:f2:b5:c6:b7:f5:b3:
    76:69:a3:e8:f6:b7:35:f4:3c:52:6d:3c:a0:b6:a1:
    e4:1a:32:05:1d:51:68:21:7d:fc:53:69:ec:bc:0b:
    a0:db:63:b2:0e:47:00:03:4d:98:1f:ab:c0:7b:2e:
    3c:8f:b6:36:ff:f0:db:80:26:f0:a6:af:30:2f:7b:
    16:fd:5c:db:0f:2c:54:8a:26:2b:db:3d:78:49:4b:
    7b:d1:60:ea:a7:f0:b4:5e:fc:33:ff:57:f8:83:fd:
    12:64:8f:29:d1:94:96:9a:15:18:5d:04:ca:1c:29:
    44:ad:42:31:c5:80:38:4c:eb:3b:b8:7e:17:27:5c:
    69:a8:88:44:ea:d1:82:64:fe:51:31:47:97:a7:a9:
    87:c3:13:c9:00:7a:b9:fb:6f:cc:66:4c:07:d7:68:
    fa:78:68:9a:e7:87:1e:94:c6:27:92:5f:f2:7d:11:
    44:11:b5:39:35:59:2c:cd:f9:4f:59:e3:56:93:1f:
    94:20:fd:6b:23:0d:15:e6:4e:bb:84:a8:a5:0d:9f:
    1c:90:ab:a8:10:04:50:12:c1:80:02:94:85:78:df:
    d6:b3
Exponent: 65537 (0x10001)
writing RSA key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw1b1CcypPsoWLvvSi52p
M1qHjz96u4o9YptdVoSVl7uX8HfiyFnytca39bN2aaPo9rc19DxSbTygtqHkGjIF
HVFoIX38U2nsvAug22OyDkcAA02YH6vAey48j7Y2//DbgCbwpq8wL3sW/VzbDyxU
iiYr2z14SUt70WDqp/C0Xvwz/1f4g/0SZI8p0ZSWmhUYXQTKHClErUIxxYA4TOs7
uH4XJ1xpqIhE6tGCZP5RMUeXp6mHwxPJAHq5+2/MZkwH12j6eGia54celMYnkl/y
fRFEEbU5NVkszflPWeNWkx+UIP1rIw0V5k67hKilDZ8ckKuoEARQEsGAApSFeN/W
swIDAQAB
-----END PUBLIC KEY-----

Pagrindiniai sertifikatai#

Galima nustatyti ir užklausti NetHSM egzemplioriuje saugomų raktų sertifikatus:

$ curl -i -w '\n' -u admin -X PUT \
https://$NETHSM_HOST/api/v1/keys/myFirstKey/cert -H "content-type: application/x-pem-file" \
--data-binary @/tmp/cert.pem

HTTP/1.1 201 Created
content-length: 0
content-type: text/html
date: Thu, 20 May 2021 19:15:39 GMT
vary: Accept, Accept-Encoding, Accept-Charset, Accept-Language
 $ curl -s -w '\n' -u operator -X GET \
https://$NETHSM_HOST/api/v1/keys/myFirstKey/cert > /tmp/cert.pem
$ curl -i -w '\n' -u admin -X DELETE \
https://$NETHSM_HOST/api/v1/keys/myFirstKey/cert

HTTP/1.1 204 No Content
content-type: text/html
date: Thu, 20 May 2021 19:14:45 GMT
vary: Accept, Accept-Encoding, Accept-Charset, Accept-Language

Rakto sertifikato pasirašymo užklausos#

NetHSM palaiko saugomų raktų sertifikatų pasirašymo prašymų (CSR) generavimą:

$ curl -s -w '\n' -u operator -X POST \
https://$NETHSM_HOST/api/v1/keys/myFirstKey/csr.pem -H "content-type: application/json" \
-d "{ \"countryName\": \"DE\", \"stateOrProvinceName\": \"BE\", \
\"localityName\": \"Berlin\", \"organizationName\": \"ACME\", \
\"organizationalUnitName\": \"IT\", \"commonName\": \"example.com\", \
\"emailAddress\": \"it@example.com\" }" > /tmp/cert.pem

Pagrindinės operacijos#

Dešifravimas#

Naudodami OpenSSL galime užšifruoti duomenis, skirtus NetHSM saugomam raktui. (public.pem yra viešojo rakto failas, kurį sukūrėme Show Key Details skirsnyje.)

$ echo 'NetHSM rulez!' | OpenSSL rsautl -encrypt -inkey public.pem -pubin | base64 > data.crypt

Dabar galime naudoti NetHSM duomenims iššifruoti:

$ curl -s -u operator -X POST \
https://$NETHSM_HOST/api/v1/keys/myFirstKey/decrypt -H "content-type: application/json" \
-d "{ \"mode\": \"PKCS1\", \"encrypted\": \"$(cat data.crypt)\"}" | \
jq -r .decrypted | base64 -d

NetHSM rulez!

Pasirašymas#

Panašiai galime pasirašyti duomenis naudodami NetHSM raktą. RSA ir ECDSA atveju pirmiausia turime apskaičiuoti suvestinę:

$ echo 'NetHSM rulez!' > data
$ openssl dgst -sha256 -binary data | base64 > data.digest

Tada iš šios suvestinės, naudodami NetHSM, galime sukurti parašą:

$ curl -s -u operator -X POST \
https://$NETHSM_HOST/api/v1/keys/myFirstKey/sign -H "content-type: application/json" \
-d "{ \"mode\": \"PSS_SHA256\", \"message\": \"$(cat data.digest)\"}" | \
jq -r .signature | base64 -d > data.sig

Tada naudokite „OpenSSL“ parašui patikrinti:

$ openssl dgst -sha256 -verify public.pem -signature data.sig \
-sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:-1 data

Verified OK

Atsarginės kopijos#

Galima sukurti atsarginę „NetHSM“ kopiją, kurioje būtų ir konfigūracija, ir išsaugoti raktai. Norėdami sukurti atsarginę kopiją, pirmiausia turite nustatyti atsarginės kopijos slaptažodį, kuris naudojamas atsarginės kopijos failui užšifruoti:

$ curl -i -w '\n' -u admin -X PUT \
https://$NETHSM_HOST/api/v1/config/backup-passphrase -H "content-type: application/json" \
-d "{\"passphrase\": \"backupencryptionkey\"}"

HTTP/2 204
server: nginx/1.14.2
date: Sat, 08 May 2021 10:26:36 GMT
cache-control: no-cache
vary: Accept, Accept-Encoding, Accept-Charset, Accept-Language
strict-transport-security: max-age=63072000; includeSubDomains; preload
x-frame-options: DENY
x-content-type-options: nosniff
x-xss-protection: 1; mode=block
x-permitted-cross-domain-policies: none

Dabar turite sukurti naudotoją, kuriam suteiktas R-Backup vaidmuo:

$ curl -i -w '\n' -u admin -X PUT \
https://$NETHSM_HOST/api/v1/users/backup -H "content-type: application/json" \
-d "{\"realName\": \"Backup User\", \"role\": \"Backup\", \
\"passphrase\": \"backupPassphrase\"}"

HTTP/2 201
server: nginx/1.14.2
date: Sat, 08 May 2021 10:30:45 GMT
content-type: application/json
content-length: 0
location: /api/v1/users/backup
vary: Accept, Accept-Encoding, Accept-Charset, Accept-Language
strict-transport-security: max-age=63072000; includeSubDomains; preload
x-frame-options: DENY
x-content-type-options: nosniff
x-xss-protection: 1; mode=block
x-permitted-cross-domain-policies: none

Gaukite atsarginę kopiją ir išsaugokite ją faile:

$ curl -s -u backup -X POST \
https://$NETHSM_HOST/api/v1/system/backup > /tmp/nethsm-backup

Šį atsarginės kopijos failą galima atkurti tik neįdiegtoje NetHSM instancijoje:

$ curl -i -X POST \
"https://$NETHSM_HOST/api/v1/system/restore?backupPassphrase=backupencryptionkey&systemTime=$(date --utc +"%Y-%m-%dT%H:%M:%SZ")" \
 --data-binary @/tmp/nethsm-backup

HTTP/1.1 204 No Content
cache-control: no-cache
content-type: application/json
date: Sat, 08 May 2021 10:59:19 GMT
vary: Accept, Accept-Encoding, Accept-Charset, Accept-Language

Atnaujinimai#

NetHSM atnaujinimus galima įdiegti dviem etapais. Pirmiausia reikia įkelti atnaujinimo atvaizdą į „NetHSM“. Tada atvaizdas patikrinamas ir patvirtinamas. Jei patvirtinimas sėkmingas, „NetHSM“ grąžina atnaujinimo išleidimo pastabas:

$ curl -i -w '\n' -u admin -X POST  \
https://$NETHSM_HOST/api/v1/system/update --data-binary "@/tmp/nethsm-update.img.cpio"

Jei norite tęsti diegimą, dabar galite patvirtinti naujinimą:

$ curl -i -w '\n' -u admin -X POST  \
https://$NETHSM_HOST/api/v1/system/commit-update

Taip pat galite atšaukti naujinimą:

$ curl -i -w '\n' -u admin -X POST  \
https://$NETHSM_HOST/api/v1/system/cancel-update