在 YubiKey 上生成私钥并在 Windows 上使用
截止到我写这篇博客,我在网络上所看到的将 Yubikey PIV 证书与 Windows 一起使用的教程和文档都是已经有完整的私钥和公钥(在 Yubikey 外生成),将其安装在 Windows 和导入到 Yubikey 使用。但是,Yubikey 还提供了一种具有更高安全性的选项:在 Yubikey 上生成私钥,这种方法的好处是私钥不会离开 Yubikey,因此不可能被泄露。但是在这样的情况下,我们没有可以用于导入到 Windows 的私钥,Windows 并不知道我们具有相应数字证书的私钥,在签名时不会将我们的证书作为可用的证书。
本文将介绍如何在 Yubikey 上生成私钥,使 Windows 将证书与 Yubikey 上的私钥相关联,以便在 Windows 上进行代码签名。尽管本文的目的是进行代码签名,但是文中的关联方法也适用于其他需要使用在 Yubikey 上生成的私钥的场景。
将私钥在 Yubikey 上的证书导入 Windows
在硬件安全模块 (HSM) 的使用中,在外部硬件上生成私钥并委托其签名是一种相当常见的工作流程,我相信 Windows 证书管理一定支持外部的私钥。于是我搜索了 Yubico 的 HSM 产品 YubiHSM2 的文档,并在其代码签名的文档中找到了这样一段话:
After importing the certificate to your personal store, use the certutil utility provided by Windows to associate the YubiHSM private key to the certificate.
1> certutil -repairstore my <certificate hash>
尽管这条命令也可以用于 Yubikey,但是问题并没有这么简单。
让 certutil 识别到 Yubikey 上的证书
要让这条命令起作用,你需要:
- 安装 YubiKey Smart Card Minidriver
- Yubikey PIV 的管理密码必须处于受 PIN 保护的模式
然后尝试用 certutil -scinfo
看看能否识别到 Yubikey 上的证书。
你有可能会遇到这样的错误:
这有两种可能的原因:
- Yubikey PIV 的管理密码并非处于受 PIN 保护的模式。
- 偶尔会出现的 bug,此时重新插拔 Yubikey 即可。似乎在使用完 Yubikey 的 GPG 功能后再使用 PIV 功能时会出现这个问题。我相信这是一个 bug。
导入证书并关联私钥
如果 certutil
已经能够识别到 Yubikey 上的证书,那么你可以将证书导入到 Windows 的证书存储中:
- GUI中:打开管理用户证书,安装到个人
- CLI: 安装到证书路径
cert:\currentuser\my
然后,使用 certutil -v -user -csp "Microsoft Smart Card Key Storage Provider" -repairstore my <fingerprint>
将证书与 Yubikey 上的私钥关联起来。
- 注意 CSP 不是
Microsoft Base Smart Card Crypto Provider
,可能有误导 - 你的 CSP 应该会和我一样,不一样的话以
certutil -scinfo
的输出为准
现在证书管理器里,证书上应该会显示一个小钥匙,表示你拥有它的私钥。
使用 Yubikey 进行代码签名
首先选择使用的证书:
1 |
|
在弹出的对话框里面选一个。然后:
1 |
|
签名的文件可以是 ps1 脚本和 exe 可执行文件。
运行签名的 ps1 脚本
PowerShell 的默认执行策略是不允许运行任何脚本。要改为仅允许签名的脚本:
1 |
|
如果希望运行脚本时不出现警告,你还需要把证书复制到受信任的发布者(Trusted Publishers)。
References
- StackOverflow - Yubikey PIV "The smartcard cannot perform the requested operation."
- YubiHSM2 Docs - Creating a Code-Signing Certificate using the Key Storage Provider
- PowerShell Docs - about_Execution_Policies
- Microsoft Devblogs - How Can I Sign Windows PowerShell Scripts with an Enterprise Windows PKI? (Part 2 of 2)
- Yubico - Code Signing with the YubiKey on Windows
在 YubiKey 上生成私钥并在 Windows 上使用
https://blog.caomingjun.com/series/yubikey/piv-windows-repairstore/