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は16進数のキーIDを使ってキーを識別する。NetHSM は英数字の文字列を鍵 ID として使用する。NetHSM の PKCS#11 モジュールは、文字列の生のバイト値を PKCS#11 ID として使用する。NetHSM キーの16進数バージョンは``xxd`` で取得できる:

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

この16進数値を``--id`` オプションで pkcs11-tool に渡すことができる。

鍵の生成

キーペアを生成し、NetHSMに保存します。

注釈

使用したいスロットは、設定ファイルにandministratorユーザーを持つ必要があります。そうでない場合は CKR_USER_NOT_LOGGED_IN エラーが発生します。

アールエスエー

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

アールエスエー

公開鍵でデータを暗号化し、秘密鍵で復号することができる。

# 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