我想将 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.crt
和key client.key
,改为cryptoapicert "THUMB:371f180ba80234845a93b116ea02e5222dffad1e"
在您的 OpenVPN 中提供。其中 371f180ba80234845a93b116ea02e5222dffad1e 应替换为您自己的客户端证书的指纹。您可以在之后client.conf
的输出中找到您的证书指纹certutil -scinfo
Cert:
。
不幸的是微软的虚拟智能卡不支持RSA-PSS
TLS 1.3 所需的功能,最近的 OpenVPN 也使用 TLS 1.2 来使用它。OpenVPN 目前无法检测到它不可用,因此会失败(https://community.openvpn.net/openvpn/ticket/1296) 尝试使用它时。如果 MS 或 OpenVPN 仍未修补此问题,则必须使用较旧的 OpenVPN 版本 2.4.8 作为解决方法。