在 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 上的证书

要让这条命令起作用,你需要:

  1. 安装 YubiKey Smart Card Minidriver
  2. Yubikey PIV 的管理密码必须处于受 PIN 保护的模式

然后尝试用 certutil -scinfo 看看能否识别到 Yubikey 上的证书。

你有可能会遇到这样的错误:

这有两种可能的原因:

  1. Yubikey PIV 的管理密码并非处于受 PIN 保护的模式。
  2. 偶尔会出现的 bug,此时重新插拔 Yubikey 即可。似乎在使用完 Yubikey 的 GPG 功能后再使用 PIV 功能时会出现这个问题。我相信这是一个 bug。

导入证书并关联私钥

有的时候 `certutil -scinfo` 会自动完成这一步,我也不知道为什么,建议先检查一下。

如果 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
$Cert = Get-ChildItem -Path 'cert:\currentuser\my' -CodeSigning | Out-GridView -PassThru

在弹出的对话框里面选一个。然后:

1
Set-AuthenticodeSignature -Certificate $Cert -FilePath <file to sign>

签名的文件可以是 ps1 脚本和 exe 可执行文件。

运行签名的 ps1 脚本

PowerShell 的默认执行策略是不允许运行任何脚本。要改为仅允许签名的脚本:

1
Set-ExecutionPolicy -ExecutionPolicy AllSigned -Scope CurrentUser

如果希望运行脚本时不出现警告,你还需要把证书复制到受信任的发布者(Trusted Publishers)。

References

  1. StackOverflow - Yubikey PIV "The smartcard cannot perform the requested operation."
  2. YubiHSM2 Docs - Creating a Code-Signing Certificate using the Key Storage Provider
  3. PowerShell Docs - about_Execution_Policies
  4. Microsoft Devblogs - How Can I Sign Windows PowerShell Scripts with an Enterprise Windows PKI? (Part 2 of 2)
  5. Yubico - Code Signing with the YubiKey on Windows

在 YubiKey 上生成私钥并在 Windows 上使用

https://blog.caomingjun.com/series/yubikey/piv-windows-repairstore/

作者

Cao Mingjun

发布于

2023-08-08

更新于

2023-08-08

许可协议

评论