如何在不将 Windows 计算机加入域的情况下在 TPM 上创建“虚拟智能卡”?

如何在不将 Windows 计算机加入域的情况下在 TPM 上创建“虚拟智能卡”?

我想将 OpenVPN 客户端证书存储在由我的 TPM 保护的笔记本电脑上,这样即使具有管理员权限,证书也无法从笔记本电脑中被盗/提取。

微软提供“虚拟智能卡“使用 TPM。我应该能够通过OpenVPN client.config 中的 PKCS11。 有CAPI 到 PKCS11 库/适配器

我可以使用以下命令创建虚拟智能卡读卡器:

tpmvscmgr.exe create /name OpenVPN1 /pin prompt /pinpolicy minlen 4 maxlen 8 /adminkey random /generate

这可行。但是现在我需要一种方法来实际生成公钥/私钥和证书签名请求,以便我可以在我的 openssl CA 上签名。

然而微软教程希望您将计算机连接到具有域控制器的域。并在域控制器上创建“证书模板”。我不想/不需要这个。我没有使用 Microsoft CA。我有一个单独的 openssl CA。

有没有办法创建公钥/私钥对,而无需将笔记本电脑加入域?

答案1

因此,回答我自己的问题:

我没有找到直接在智能卡上创建密钥对的方法。但你可以导入一个。从那时起它将被锁定在虚拟智能卡中(密钥将是neverExtract)。

首先根据问题以 tpmvscmgr.exe create /name OpenVPN1 /pin prompt /pinpolicy minlen 4 maxlen 8 /adminkey random /generate管理员身份创建智能卡(读卡器)。

现在certutil -scinfo将显示虚拟阅读器,但将无法显示证书,因为还没有证书。

为了继续,您需要一个组合的 pkcs12 文件。您可以在 TPM 之外创建客户端密钥对,并像往常一样由您的 CA 对其进行签名,例如使用 openssl。如果您将生成的文件作为单独的 .key 和 .crt,您可以使用例如将它们与 OpenSSL 组合在一起 “C:\Program Files\OpenSSL-Win64\bin\openssl" pkcs12 -export -out client.pfx -inkey client.key -in client.crt确保在将这些文件导入虚拟智能卡后安全地从存储中擦除这些文件。

然后你可以用它导入到虚拟智能卡中certutil。运行certutil -csp "Microsoft Base Smart Card Crypto Provider" -importpfx client.pfx 请注意参数的顺序很重要:-importpfx必须最后提供。

现在certutil -scinfo将出示证书。

PS:Windows 版 OpenVPN 默认编译时不支持 PKCS11。但它可直接与 CAPI 配合使用。

删除cert client.crtkey client.key,改为cryptoapicert "THUMB:371f180ba80234845a93b116ea02e5222dffad1e"在您的 OpenVPN 中提供。其中 371f180ba80234845a93b116ea02e5222dffad1e 应替换为您自己的客户端证书的指纹。您可以在之后client.conf的输出中找到您的证书指纹certutil -scinfoCert:

不幸的是微软的虚拟智能卡不支持RSA-PSSTLS 1.3 所需的功能,最近的 OpenVPN 也使用 TLS 1.2 来使用它。OpenVPN 目前无法检测到它不可用,因此会失败(https://community.openvpn.net/openvpn/ticket/1296) 尝试使用它时。如果 MS 或 OpenVPN 仍未修补此问题,则必须使用较旧的 OpenVPN 版本 2.4.8 作为解决方法。

相关内容