Nitropy命令行工具#

本教程演示了如何通过`nitropy <https://github.com/Nitrokey/pynitrokey>`_命令行工具访问NetHMS,你需要下载和安装该工具。

注解

如果你使用带有自签名证书的NetHSM演示实例,例如使用Docker镜像,你将不得不使用``–no-verify-tls``选项来跳过证书检查。

注解

首先将$NETHSM_HOST的值设置为你的NetHSM的IP地址或URL。我们的演示服务器可以在https://nethsmdemo.nitrokey.com/

设备信息& 状态#

$ nitropy nethsm --host $NETHSM_HOST info

Host:    localhost:8443
Vendor:  Nitrokey GmbH
Product: NetHSM
$ nitropy nethsm --host $NETHSM_HOST state

NetHSM localhost:8443 is Unprovisioned

供应#

一个新的NetHSM需要首先配置密码和当前时间。管理密码是管理员的密码,它是NetHSM的超级用户。解锁密码用于加密NetHSM的机密数据存储。

注解

位于nethsmdemo.nitrokey.com的NetHSM演示实例已经被配置。

$ nitropy nethsm --host $NETHSM_HOST provision

NetHSM localhost:8443 provisioned

NetHSM可以在*Attended Boot*模式和*Unattended Boot*模式下使用。

  • 在*Attended Boot*模式下,每次启动时都需要输入*Unlock Passphrase*,它被用来加密数据存储。出于安全考虑,建议使用这种模式。

  • 在*无人值守启动*模式下,不需要解锁密码,因此NetHSM可以在无人值守的情况下启动,而且数据存储是不加密的。如果你的可用性要求无法通过*无人值守启动*模式得到满足,请使用这种模式。

检索当前模式。

$ nitropy nethsm --host $NETHSM_HOST get-config --unattended-boot

 Configuration for NetHSM localhost:8443:
 Unattended boot: off

开启 “无人值守启动 “模式。

$ nitropy nethsm --host $NETHSM_HOST set-unattended-boot on

 Updated the unattended boot configuration for NetHSM localhost:8443

用户管理#

角色#

职责分离可以通过使用不同的角色来实现。在NetHSM上配置的每个用户账户都有一个分配给它的下列角色。以下是对每个角色所允许的操作的高层次描述。关于终端的具体细节,请参考REST API文档。

  • R-Administrator。拥有此角色的用户账户可以访问REST API提供的所有操作,但密钥使用操作除外,即消息签名和解密。

  • R-Operator:拥有此角色的用户账户可以访问所有的钥匙使用操作,只读的钥匙管理操作子集和用户管理操作,只允许对他们自己的账户进行更改。

  • R-Metrics。拥有此角色的用户账户只能访问只读的度量衡操作。

  • R-Backup:拥有此角色的用户账户只能访问启动系统备份所需的操作。

注意:在未来的版本中,可能会引入额外的角色。

创建& 删除用户

现在创建一个具有操作员角色的新用户,可以用来签署和解密数据。注意,如果我们不指定,NetHSM会随机分配一个用户ID。

$ nitropy nethsm --host $NETHSM_HOST  add-user --real-name "Jane User" --role Operator

User Operator added to NetHSM localhost:8443
$ nitropy nethsm --host $NETHSM_HOST delete-user "Jane User"

关键管理#

生成钥匙#

在这一节中,我们想用RSA密钥来解密使用PKCS#1的数据,并使用SHA256来签署PSS的数据。 因此,让我们在NetHSM上生成一个新的密钥。确保使用RSA算法并选择RSA_Signature_PSS_SHA256和RSA_Decryption_PKCS1密钥机制。 如果你没有指定一个密钥ID,NetHSM将为新的密钥生成一个随机的ID。

$ nitropy nethsm --host $NETHSM_HOST  generate-key --type RSA --mechanism RSA_Signature_PSS_SHA256 --mechanism RSA_Decryption_PKCS1 --length 2048 --key-id myFirstKey

Key myFirstKey generated on NetHSM localhost:8443

进口钥匙#

你也可以将现有的私钥导入NetHSM,而不是在NetHSM上生成一个密钥。

$ nitropy nethsm --host $NETHSM_HOST  add-key --type RSA --mechanism RSA_Signature_PSS_SHA256 --mechanism RSA_Decryption_PKCS1 --key-id mySecondKey --public-exponent AQAB --prime-p "AOnWFZ+JrI/xOXJU04uYCZOiPVUWd6CSbVseEYrYQYxc7dVroePshz29tc+VEOUP5T0O8lXMEkjFAwjW6C9QTAsPyl6jwyOQluMRIkdN4/7BAg3HAMuGd7VmkGyYrnZWW54sLWp1JD6XJG33kF+9OSar9ETPoVyBgK5punfiUFEL" \
    --prime-q "ANT1kWDdP9hZoFKT49dwdM/S+3ZDnxQa7kZk9p+JKU5RaU9e8pS2GOJljHwkES1FH6CUGeIaUi81tRKe2XZhe/163sEyMcxkaaRbBbTc1v6ZDKILFKKt4eX7LAQfhL/iFlgi6pcyUM8QDrm1QeFgGz11ChM0JuQw1WwkX06lg8iv"

Key mySecondKey added to NetHSM localhost:8443

列表键#

为了确保钥匙已经被创建,并且具有正确的算法和机制设置,我们可以查询NetHSM上的所有钥匙。

$ nitropy nethsm --host $NETHSM_HOST list-keys
Keys on NetHSM localhost:8443:

Key ID          Algorithm       Mechanisms                                      Operations
----------      ---------       ----------------------------------------------  ----------
myFirstKey      RSA             RSA_Decryption_PKCS1, RSA_Signature_PSS_SHA256  0
mySecondKey     RSA             RSA_Decryption_PKCS1, RSA_Signature_PSS_SHA256  0

显示关键细节#

我们还可以查询生成的密钥对的公钥。

$ nitropy nethsm --host $NETHSM_HOST get-key myFirstKey

为了能够在OpenSSL中使用该密钥,我们将其导出为PEM文件,并将其存储为public.pem。

$ nitropy nethsm --host $NETHSM_HOST get-key myFirstKey --public-key > public.pem

我们可以用OpenSSL检查该密钥,并将其用于加密或签名验证(如下一节所述)。

$ 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-----

关键证书#

可以为存储在NetHSM实例上的密钥设置和查询证书。

$ nitropy nethsm --host $NETHSM_HOST  set-certificate myFirstKey --mime-type application/x-pem-file /tmp/cert.pem

Updated the certificate for key myFirstKey on NetHSM localhost:8443
$ nitropy nethsm --host $NETHSM_HOST get-certificate myFirstKey > /tmp/cert.pem

密钥证书签名请求#

NetHSM支持为存储的密钥生成证书签名请求(CSR)。

$ nitropy nethsm --host $NETHSM_HOST csr --key-id myFirstKey --country DE --state-or-province BE --locality Berlin --organization ACME --organizational-unit IT --common-name example.com --email-address it@example.com

关键业务#

我们可以使用OpenSSL对存储在NetHSM上的密钥进行数据加密。(public.pem是我们在显示密钥细节部分创建的公钥文件。)

$ echo 'NetHSM rulez!' | OpenSSL rsautl -encrypt -inkey public.pem -pubin | base64 > data.crypt
$ nitropy nethsm -h $NETHSM_HOST decrypt -k myFirstKey -d "$(cat data.crypt)" -m PKCS1 | base64 -d

NetHSM rulez!

同样地,我们可以使用NetHSM上的密钥来签署数据。对于RSA和ECDSA,我们必须先计算出一个摘要。

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

然后我们可以使用NetHSM从这个摘要中创建一个签名。

$ nitropy nethsm -h $NETHSM_HOST sign -k myFirstKey -m PSS_SHA256 -d "$(cat data.digest)" | base64 -d > data.sig

然后用OpenSSL来验证签名。

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

Verified OK

创建备份#

可以创建一个NetHSM的备份,同时捕捉到配置和存储的密钥。为了创建一个备份,你首先要设置一个备份口令,用来加密备份文件。

$ nitropy nethsm -h $NETHSM_HOST -u admin set-backup-passphrase

Updated the backup passphrase for NetHSM localhost:8443

现在你必须创建一个具有R-Backup角色的用户。

$ nitropy nethsm -h $NETHSM_HOST -u admin add-user --user-id backup --real-name "Backup User" --role backup

User backup added to NetHSM localhost:8443

然后你是否可以生成备份并将其写入文件。

$ nitropy nethsm -h $NETHSM_HOST backup /tmp/nethsm-backup

Backup for localhost:8443 written to /tmp/backup

恢复备份#

这个备份文件可以在一个未配置的NetHSM实例上恢复。

$ nitropy nethsm -h $NETHSM_HOST restore --backup-passphrase backup-passphrase backupencryptionkey /tmp/nethsm-backup

Backup restored on NetHSM localhost:8443

更新NetHSM#

警告

由于安装了测试版更新,可能会出现数据丢失的情况!

$ nitropy nethsm --host $NETHSM_HOST  update /tmp/nethsm-update.img.cpio

Image /tmp/nethsm-update.img.cpio uploaded to NetHSM localhost:8443

如果你想继续安装,你现在可以提交更新。

$ nitropy nethsm --host $NETHSM_HOST     commit-update

Update successfully committed on NetHSM localhost:8443

或者,你也可以取消更新。

$ nitropy nethsm --host $NETHSM_HOST  cancel-update

Update successfully cancelled on NetHSM localhost:8443