我想使用 Yubico Yubikey 5 上的私钥使用
signtool.exe
进行 EV 代码签名,但是每次我签署文件时,它都会提示输入密码。我希望该密钥的输入能够作为在安全计算机上触发的构建管道的一部分自动进行。
我之前使用过 Safenet 令牌,并且能够使用以下解决方案来做到这一点 这个问题,但是我的理解是这个功能是
eToken Cryptographic Security Provider
使用的Safenet
的特定实现。
我已经从 Yubikey 导出了公共证书,并使用
certutil
转储有关密钥容器的信息(类似于 GUID
的 0bababab-0000-aaaa-baba-cdcdcdcdcdcd
)和 CSP
Microsoft Smart Card Key Storage Provider
,但是当我使用此信息时我遇到以下问题:
signtool sign /f <cert file>.crt /csp "Microsoft Smart Card Key Storage Provider" /v /kc <container_id>
Error information: "CryptExportPublicKeyInfoEx failed" (-2146893819/0x80090005)
SignTool Error: An unexpected internal error has occurred.
除了
Microsoft Smart Card
支持之外,Yubikey还支持PKCS11
。 signtool.exe
本身不支持此接口,但它受到 osslsigncode
等第三方工具的支持,它允许通过 CLI 提供密钥密码。
这是我如何让它工作的:
OpenSSL
,即从此处
重要提示:确保将其安装到 C:\OpenSSL-Win64
而不是默认的 C\Program Files\OpenSSL-Win64
这里下载并安装
yubico-piv-tool
,并记下文件libykcs11.dll
的位置,应位于C:\Program Files\Yubico\Yubico PIV Tool\bin
libp11
libp11
编译nmake
,更详细的说明这里。 注意: 当前版本的 make 文件对 OpenSSL
安装到步骤 1 中的目录第4步生成的
pkcs11.dll
的位置,这将是我们的pkcs11engine
的
osslsigncode
osslsigncode
,即从这里并将其位置添加到您的PATH
变量.crt
文件并记下其位置osslsigncode sign -pkcs11module <location_of_libykcb11.dll> -pkcs11engine <location_of_pkcs11.dll> -pass <yubikey_passcode> -ts <timestamp_server_url> -key "pkcs11:id=%01" -certs <path_to_public_cert.crt> -in "input_file.exe" -out "output_file.exe"
其他资源:
pkcs11-tool
对于运行此程序非常有用