跳转到内容
搜索文档

SoftHSMv2

最后更新 查看 MarkdownAgent 设置

1. 安装并配置 SoftHSMv2

首先,我们安装 SoftHSMv2 并将其配置为在默认位置 /var/lib/softhsm/tokens 存储令牌。我们还需要授予 softhsm 组对此目录的权限,因为这是 keyless 用户访问此目录的方式。

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),后者将发送给证书颁发机构 (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,并为密钥提供唯一的十六进制 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 配置文件并重启服务

密钥就绪后,是时候构建密钥服务器在启动时将读取的配置文件了。id 指的是您向 softhsm2-util 导入语句提供的十六进制 ID;我们使用了 a000,因此编码为 %a0%00module-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

这篇文档对您有帮助吗?