使用存储在 Yubikey 上的 CA 签署证书签名请求

Signing a Certificate Signing Request using a CA stored on a Yubikey

我想使用存储在 PIV 数字签名槽中的私钥和证书签署证书签名请求。

我正在使用最新版本的 OpenSC for MacOS(https://github.com/OpenSC/OpenSC/releases/tag/0.19.0)。

我已经尝试过 pkcs11-tool、pkcs15-tool 和 yubikey-piv-tool。 这三个工具都提供了 --sign API,但它们签署了从数据生成的摘要。

我的要求是签署证书签名请求以生成证书。

我唯一的选择是对 OpenSSL 使用 PKCS#11 引擎。 PKCS#11 引擎:brew install engine_pkcs11 PKCS#11 模块:opensc-pkcs11.so

我将使用常规 OpenSSL 命令签署 CSR,使用引擎选项提供密钥和存储在 Yubikey 上的证书。(可能使用 PKCS#11 URI)

使用 OpenSSL 1.0.2,我尝试了以下命令。

engine -t dynamic -pre SO_PATH:/usr/local/Cellar/engine_pkcs11/0.1.8/lib/engines/engine_pkcs11.so -pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:/Library/OpenSC/lib/opensc-pkcs11.so

回复:

(dynamic) Dynamic engine loading support
[Success]: SO_PATH:/usr/local/Cellar/engine_pkcs11/0.1.8/lib/engines/engine_pkcs11.so
[Success]: ID:pkcs11
[Success]: LIST_ADD:1
[Success]: LOAD
[Success]: MODULE_PATH:/Library/OpenSC/lib/opensc-pkcs11.so
Loaded: (pkcs11) pkcs11 engine
     [ available ]

要签署 CSR,我正在使用此命令,

req -engine pkcs11 -keyform engine -key 02 -new -x509 -in ~/Desktop/sample.csr -out cert.pem 

回复:

engine "pkcs11" set.
PKCS#11 token PIN:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields, there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []: a.com
Email Address []:
4536252012:error:8000A101:PKCS11 library:PKCS11_rsa_sign:User not logged in:p11_ops.c:131:
4536252012:error:0D0DC006:asn1 encoding routines:ASN1_item_sign_ctx:EVP lib:a_sign.c:306:

即使输入了正确的 PIN 码,我仍然收到此错误。 Yubikey 证书上的 CA key/cert 也没有密码。

在 PyKCS#11 示例中遇到类似错误: https://github.com/LudovicRousseau/PyKCS11/issues/61

使用另一个类似的 OpenSSL 命令。

OPENSSL_CONF=engine.conf openssl x509 -req -engine pkcs11 -in ~/Desktop/sample.csr -CAkeyform engine -CAkey 02 -CA rootCA.pem -sha256 -out cert.pem

回复:

engine "pkcs11" set.
Signature ok
subject=/CN=C44F3320626D/C=IN/ST=MH/O=test
Getting CA Private Key
PKCS#11 token PIN:
4394223212:error:06067099:digital envelope routines:EVP_PKEY_copy_parameters:different parameters:p_lib.c:137:
4394223212:error:8000A101:PKCS11 library:PKCS11_rsa_sign:User not logged in:p11_ops.c:131:
4394223212:error:0D0DC006:asn1 encoding routines:ASN1_item_sign_ctx:EVP lib:a_sign.c:306:

我想知道问题是否出在 macOS OpenSSL、Yubikey、PKCS#11 或 OpenSSL-PKCS#11 引擎中。

我希望使用 Yubikey 将 CSR 签署到 MacOS 上的证书中。请帮忙。

你的 -CAkey 02 应该是 -CAkey slot_0-id_2 for slot 9c / index 02 在 yubikey 上,其他一切看起来都不错(尽管注意有一个 issue 插槽 9c 上的引脚要求可能会影响您)。

有关使用 pkcs#11 的 yubikeys 的工作示例,您可能想查看 https://github.com/ryankurte/pki

祝你好运!