pkcs11 工具

`pkcs11-tool<https://github.com/OpenSC/OpenSC/wiki/Using-pkcs11-tool-and-OpenSSL>`__ 是`OpenSC<https://github.com/OpenSC/OpenSC>`__ 项目的一个工具,可用于管理 PKCS#11 设备上的密钥。

您需要通过``--module`` 选项传递要使用的 PKCS#11 模块的位置:

pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so

将``/usr/lib/nitrokey/libnethsm_pkcs11.so`` 替换为 NetHSM PKCS#11 模块所在的路径。

您可以使用下一条命令测试模块是否正常工作:

pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --show-info

你应该看到这样的内容:

Cryptoki version 2.40
Manufacturer     Nitrokey
Library          Nitrokey PKCS#11 library (ver 0.1)

槽位列表

有关可用插槽的信息。列出的插槽取决于`p11nethsm.conf`配置文件中插槽阵列的配置。要了解有关插槽配置的更多信息,请参阅 "配置<pkcs11-setup.html#Configuration>`_"一章。

pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --list-slots
Slot 0 (0x0): NetHSM
  token label        : LocalHSM
  token manufacturer : Nitrokey GmbH
  token model        : NetHSM
  token flags        : rng, token initialized, PIN initialized
  hardware version   : 0.1
  firmware version   : 0.1
  serial num         : unknown
  pin min/max        : 0/0

备注

如果配置支持多个插槽,可能需要在 pkcs11-tool 命令中添加``--slot <arg>`` 选项,以使用正确的插槽。

关键 ID

pkcs11-tool 使用十六进制密钥 ID 来识别密钥。NetHSM 使用字母数字字符串作为密钥 ID。NetHSM 的 PKCS#11 模块使用字符串的原始字节值来形成 PKCS#11 ID。你可以通过``xxd`` 获取 NetHSM 密钥的十六进制版本:

echo -n "MyKey" | xxd -p
4d794b6579

然后,您可以使用``--id`` 选项将此十六进制值传递给 pkcs11-tool。

生成密钥

产生一个密钥对并将其存储在NetHSM上。

备注

您要使用的插槽必须在配置文件中有一个 andministrator 用户。否则会出现 CKR_USER_NOT_LOGGED_IN 错误。

RSA

pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --keypairgen --key-type rsa:2048 --label "rsakey"

ECDSA

pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --keypairgen --key-type EC:prime256v1 --label "eckey"

AES/通用

pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --keygen --key-type AES:256 --label "aeskey"

列表键

列出存储在 NetHSM 中的密钥。

pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --list-objects
Using slot 0 with a present token (0x0)
Public Key Object; RSA 2048 bits
  label:      rsakey
  ID:         7273616b6579
  Usage:      none
  Access:     none
Private Key Object; RSA
  label:      rsakey
  ID:         7273616b6579
  Usage:      decrypt, sign
  Access:     sensitive, always sensitive, never extractable

阅读键

读取存储在 NetHSM 上的密钥对的公钥。无法从 NetHSM 中读取私钥。

pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --read-object --type pubkey --label rsakey --output-file rsakey.pub

通过将``--type`` 选项改为``cert``,可以用同一命令读取密钥对的证书。

备注

输出为 DER 格式。

写键

在 NetHSM 上写入私钥。公钥由私钥自动生成。

pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --write-object rsakey.key --type privkey --id 7273616b6579

通过将``--type`` 选项改为``cert``,可以用同一命令写入密钥对的证书。

pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --write-object rsakey.crt --type cert --id 7273616b6579

加密

数据加密仅支持 AES 密钥。

echo "NetHSM rulez!  " | pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --encrypt --id 6165736b6579 --mechanism AES_CBC --output-file encrypted.txt

备注

您必须根据 AES 密钥的块大小手动填充输入数据。

解密

AES

pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --decrypt --id 6165736b6579 --mechanism AES_CBC --input-file encrypted.txt

RSA

您可以用公钥加密数据,用私钥解密数据。

# get the public key first
pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --read-object --type pubkey --id 7273616b6579 --output-file public.der

# encrypt some data with OpenSSL
echo 'NetHSM rulez!NetHSM rulez!' | openssl pkeyutl -encrypt -pubin -inkey public.der -keyform DER -out data.crypt
pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --decrypt --id 7273616b6579 --mechanism RSA-PKCS --input-file data.crypt

签名

echo "NetHSM rulez!" | openssl dgst -sha256 -binary |  pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --sign --label rsakey --mechanism RSA-PKCS-PSS --hash-algorithm SHA256 --output-file data.sig --signature-format openssl

使用 OpenSSL 验证签名:

# get the public key
pkcs11-tool --module /usr/lib/nitrokey/libnethsm_pkcs11.so --read-object --type pubkey --label rsakey --output-file public.der

echo 'NetHSM rulez!' | openssl dgst -keyform DER -verify public.der -sha256 -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:-1 -signature data.sig