在 Windows 上使用 TPM 安全地进行 SSH 密钥认证

 

一直觉得直接将 SSH 私钥以一个普通文件的形式放在 ~/.ssh 下是一件很不安全的事情. 一旦有任何软件出现漏洞, 或者用户不慎运行了恶意软件 (不要过于自信的认为这不可能发生在自己的电脑上, 有的时候一个 typo 就能让你不知不觉中执行恶意代码), 毫无防护的 SSH 密钥很容易泄漏.

也考虑过购买硬件密钥设备, 但一直带着物理的密钥总是挺繁琐的事情, 而且密钥本身体积不大对于我这种不擅长整理东西的人来说也容易丢失.


安卓/苹果设备上的 Termius 就能使用对应 OS 提供的 Keystore 确保密钥保存在相关安全硬件中, 不会离开对应的设备.

那在笔记本也都普及了 TPM 的现在, 理论上也可以使用 Windows 的 CryptoAPI 将私钥限制在 TPM 中, 安全地进行认证.

经过一些搜索和踩坑, 发现配置比想象中的更困难一些(相关的用法和资料都比较少), 但最终还是配置好了, 记录在此供参考.

前置要求:

  • Windows 10/11 操作系统
  • 支持 TPM2.0 的硬件设备 (可使用 tpm.msc 检查, 一般较新的设备都支持)

我最终使用的功能是微软的虚拟智能卡, 文档中微软更推荐使用 Windows Hello for Business, 但在这个场景下, WHfB 的配置相比 vSC (virtual Smart Card) 带来了许多不必要的复杂性, 所以目前还是先使用了 vSC.

关于虚拟智能卡的安全性可以参考微软的这篇这篇文档.

配置过程:

  1. 在 powershell 中运行命令创建一张虚拟智能卡. (类似于集成在电脑中的硬件密钥)

    此时需要输入一个 PIN 作为这个虚拟智能卡的密码.

    1
    tpmvscmgr.exe create /name vSC-SSH-PROD /pin PROMPT /adminkey random /generate /attestation AIK_AND_CERT
  2. 继续运行下面的命令在 TPM 中创建一张证书, 替换 <YOUR_NAME_HERE> 为你的名字.

    1
    New-SelfSignedCertificate -Subject "CN=<YOUR_NAME_HERE>" -KeyAlgorithm RSA -KeyLength 2048 -Provider "Microsoft Smart Card Key Storage Provider" -CertStoreLocation "Cert:\CurrentUser\My" -NotAfter (Get-Date).AddMonths(60)

    不同的 TPM 支持的加密算法不同, 我的就不支持 RSA 4096-bit/Ed25519 加密. 不过 RSA 2048 的安全性目前也足够.

    你可以在 certmgr.msc个人-证书 中看到你创建的证书.

  3. 下载并安装 WinCryptSSHAgent 这个软件, 运行后理论上你就能在 Show Public Keys 中看到你的公钥了. (同时你也不可能导出你的私钥, 没人知道你的私钥是什么)

    此时就可以将公钥添加到服务器.

    这个软件支持 Git for Windows, Putty, Xshell 等多个常见的 SSH 客户端, 按照其 README 配置后(推荐开机自启), 就可以进行认证了.

    输入 PIN 解锁 vSC输入 PIN 解锁 vSC

    认证成功认证成功

配置过程就到此结束了~ 终于又解决了一个陈年的历史遗留问题.

本文采用 CC BY-NC-SA 4.0 许可协议发布.

作者: lyc8503, 文章链接: https://blog.lyc8503.net/post/ssh-with-tpm/
如果本文给你带来了帮助或让你觉得有趣, 可以考虑赞助我¬_¬