Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

SoftHSMv2

最終更新 Markdown で表示Agent セットアップ

1. SoftHSMv2 をインストールして設定する

まず SoftHSMv2 をインストールし、トークンをデフォルトの場所 /var/lib/softhsm/tokens に保存するよう設定します。keyless ユーザーがこのディレクトリにアクセスできるよう、softhsm グループにも権限を付与する必要があります。

sudo apt-get install -y softhsm2 opensc

#...

cat <<EOF | sudo tee /etc/softhsm/softhsm2.conf
directories.tokendir = /var/lib/softhsm/tokens
objectstore.backend = file
log.level = DEBUG
slots.removable = false
EOF

sudo mkdir /var/lib/softhsm/tokens
sudo chown root:softhsm $_
sudo chmod 0770 /var/lib/softhsm/tokens
sudo usermod -G softhsm keyless
sudo usermod -G softhsm $(whoami)

echo 'export SOFTHSM2_CONF=/etc/softhsm/softhsm2.conf' | tee -a ~/.profile
source ~/.profile

2. トークンと秘密鍵を作成し、CSR を生成する

次に、スロット 0 に test-token というトークンを作成し、PIN 1234 で保護します。このスロットには、keyless-softhsm.example.com 向け SSL 証明書の RSA 鍵を保存します。

sudo -u keyless softhsm2-util --init-token --slot 0 --label test-token --pin 1234 --so-pin 4321
The token has been initialized.

cfssl を使って 秘密鍵と証明書署名リクエスト(CSR) を生成します。CSR は認証局(CA)に送って署名を受けます。

cat <<EOF | tee csr.json
{
    "hosts": [
        "keyless-softhsm.example.com"
    ],
    "CN": "keyless-softhsm.example.com",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [{
        "C": "US",
        "L": "San Francisco",
        "O": "TLS Fun",
        "OU": "Technical Operations",
        "ST": "California"
    }]
}
EOF

cfssl genkey csr.json | cfssljson -bare certificate
2018/08/12 00:52:22 [INFO] generate received request
2018/08/12 00:52:22 [INFO] received CSR
2018/08/12 00:52:22 [INFO] generating key: rsa-2048
2018/08/12 00:52:22 [INFO] encoded CSR

3. 鍵を変換してインポートする

鍵を生成したら、作成したスロットに読み込みます。その前に、PKCS#1 から PKCS#8 形式へ変換する必要があります。インポート時は、トークン初期化で使ったトークンと PIN を指定し、鍵に一意の 16 進数 ID とラベルを付けます。

openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in certificate-key.pem -out certificate-key.p8
sudo chown keyless certificate-key.p8

sudo -u keyless softhsm2-util --pin 1234 --import ./certificate-key.p8 --token test-token --id a000 --label rsa-privkey
Found slot 915669571 with matching token label.
The key pair has been imported.

インポート後、pkcs11-tool でオブジェクトがトークンに正しく保存されていることを確認します。

sudo -u keyless pkcs11-tool --module /usr/lib/softhsm/libsofthsm2.so -l -p 1234 --token test-token --list-objects
Public Key Object; RSA 2048 bits
  label:      rsa-privkey
  ID:         a000
  Usage:      verify
Private Key Object; RSA
  label:      rsa-privkey
  ID:         a000
  Usage:      sign

4. gokeyless の設定ファイルを変更してサービスを再起動する

鍵を配置したら、キーサーバーが起動時に読み込む設定ファイルを作成します。idsofthsm2-util のインポート時に指定した 16 進数 ID です。今回は a000 を使ったので、%a0%00 とエンコードします。module-path は、使っている Linux ディストリビューションによって少し異なります。Debian では /usr/lib/softhsm/libsofthsm2.so です。

/etc/keyless/gokeyless.yaml を開き、次の直後に

private_key_stores:
  - dir: /etc/keyless/keys

次を追加します。

- uri: pkcs11:token=test-token;id=%a0%00?module-path=/usr/lib/softhsm/libsofthsm2.so&pin-value=1234&max-sessions=1

設定ファイルを保存し、gokeyless を再起動して、正常に起動したことを確認します。

sudo systemctl restart gokeyless.service
sudo systemctl status gokeyless.service -l

役に立ちましたか?