无法打开虚拟机的密钥保护器。 .详细信息包含在 HostGuardianService-Client 事件日志中。咋办?备份 Hyper-V 的虚拟 TPM 证书
众所周知安装 Windows 11 的先决条件是电脑拥有可信平台模块(TPM),在虚拟机安装 Windows 11 也不例外。由于我用的是 Hyper-V,所以就以 Hyper-V 做介绍,VMware 和 VirtualBox 还不大一样。微软看来要重蹈 EFS 的覆辙,也就是没有充分告知开启虚拟 TPM 会带来的风险(为了省点口水,下称 vTPM)。
在没有加入域的电脑上 vTPM 的加密密钥和证书就存储在电脑的机器证书中,一旦你把系统重装了那么证书自然会被删除,当你装好系统和 Hyper-V,并重新导入虚拟机后,虚拟机就无法开机了。
如果没有在虚拟机内不启用 Bitlocker,那么情况会好一些,只需去掉“启用 TPM”的复选框就可以开机并且正常使用,但如果启用了 Bitlocker 那虚拟机就彻底报废了,的确没有人能恢复虚拟机的数据。开启虚拟机的提示是这样的:无法打开虚拟机“虚拟机名称”的密钥保护器。 .详细信息包含在 HostGuardianService-Client 事件日志中。参数不正确。 (0x80070057)。
有没有感觉跟当年的 EFS 似曾相识?没做微软就是这么欠打,又犯了同样的错误。但是你打他也没用,唯有吃一见长一智能避免再次被坑。
导出(备份)vTPM 的证书
有两种方法能备份 vTPM 的证书,一种方法是使用 MMC,另一种方法是用国外大神 Lars Iwer 写好的 PowerShell 脚本。想要用脚本的同学可以直接拉到下面,这里我着重介绍使用 MMC 备份 vTPM 证书的方法。
按下 Win+R 调出运行对话框,然后输入 mmc 回车。在 MMC 窗口,点击“文件”“添加或删除管理单元”。
在“添加或删除管理单元”对话框,选择“证书”然后点击“添加”。在“证书管理单元”对话框,选择“计算机帐户”单选按钮,点击“下一步”,默认选中“本地计算机”,点击“完成”。最后点击“确定”,回到 MMC 窗口。
展开左侧的证书Shielded VM Local Certificates(可能翻译为“受防护的 VM 本地证书”)证书。右侧的列表里会会出现两个证书,分别是 Shielded VM Encryption Certificate (UntrustedGuardian) 和 Shielded VM Signing Certificate (UntrustedGuardian)。
友情提示:有一些机器上不一定只有两个证书,尤其是反复重装系统和导入 vTPM 之后。但一定会有以 Shielded VM 开头的证书,而且是成对出现的。
选定要导出的 Shielded VM 证书后,点击“操作”菜单,然后点击所有任务导出。
1. 在向导的欢迎页面,点击“下一步”。
2. 在“导出私钥”的步骤,请一定要记住选中“是的,导出私钥”,否则导出的证书没有密钥,导入后照样没法解密 vTPM,切记,点击“下一步”。
3. 在“导出格式”页面,什么也不要修改直接点击“下一步”。
4. 在“安全”页面,勾选“密码”,然后为证书设置一个密码,一定要牢记该密码,或者把它写在一个安全的地方,否则忘记密码就不能导入了,设置好密码后,点击“下一步”。
5. 选择保存证书的地方,然后点击“下一步”。
6. 这是最终确认的页面,确认无误,点击“完成”。
导入(还原(vTPM 的证书
当你重装了系统并且安装了 Hyper-V 之后,再次回到 Shielded VM Local Certificates(可能翻译为“受防护的 VM 本地证书”),右键点击证书,然后指向所有任务导入。
- 在向导的欢迎页面,点击“下一步”。
- 浏览到保存的证书,然后点击“下一步”。提是:需要在浏览文件的对话框的“文件类型”中选择“个人信息交换”,否则是看不到证书文件的。
- 在“私钥保护”页面,输入导出证书时设置的密码,勾选“将此密钥标记为可导出。这将允许您在以后备份或传输您的密钥”复选框,否则下次重装系统之前,你就没办法导出证书的私钥了,切记!
- 在“证书存储”页面,直接点击“下一步”。
- 这是最终确认的页面,确认无误,点击“完成”。
使用 Powershell 脚本来导出和导入 vTPM 的证书
注意:如下脚本,版权归 Lars Iwer 所有
导出证书
将下面的内容保存为 Export-UntrustedGuardian.ps1
$GuardianName = 'UntrustedGuardian'
$CertificatePassword = Read-Host -Prompt 'Please enter a password to secure the certificate files' -AsSecureString
$guardian = Get-HgsGuardian -Name $GuardianName
if (-not $guardian)
{
throw "Guardian '$GuardianName' could not be found on the local system."
}
$encryptionCertificate = Get-Item -Path "Cert:\LocalMachine\Shielded VM Local Certificates\$($guardian.EncryptionCertificate.Thumbprint)"
$signingCertificate = Get-Item -Path "Cert:\LocalMachine\Shielded VM Local Certificates\$($guardian.SigningCertificate.Thumbprint)"
if (-not ($encryptionCertificate.HasPrivateKey -and $signingCertificate.HasPrivateKey))
{
throw 'One or both of the certificates in the guardian do not have private keys. ' + `
'Please ensure the private keys are available on the local system for this guardian.'
}
Export-PfxCertificate -Cert $encryptionCertificate -FilePath ".\$GuardianName-encryption.pfx" -Password $CertificatePassword
Export-PfxCertificate -Cert $signingCertificate -FilePath ".\$GuardianName-signing.pfx" -Password $CertificatePassword
导入证书
将下面的内容保存为 Import-UntrustedGuardian.ps1
$NameOfGuardian = 'UntrustedGuardian'
$CertificatePassword = Read-Host -Prompt 'Please enter the password that was used to secure the certificate files' -AsSecureString
New-HgsGuardian -Name $NameOfGuardian -SigningCertificate ".\$NameOfGuardian-signing.pfx" -SigningCertificatePassword $CertificatePassword -EncryptionCertificate ".\$NameOfGuardian-encryption.pfx" -EncryptionCertificatePassword $CertificatePassword -AllowExpired -AllowUntrustedRoot
使用方法
导出
在要导出证书的机器上:
- 以系统管理员的身份打开 Powershell
- 运行
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
- 用 cd 命令导航到 Export-UntrustedGuardian.ps1 的所在目录
- 运行 Export-UntrustedGuardian.ps1
- 为密钥设置一个密码,这里和图形界面不同的是不强制输入密码
- 导出成功后,证书会保存在和 Export-UntrustedGuardian.ps1 相同的目录
导入
在要导入证书的机器上安装 Hyper-V,然后:
- 以系统管理员的身份打开 Powershell
- 运行
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
- 用 cd 命令导航到 Import-UntrustedGuardian.ps1 的所在目录,这里也是 Export-UntrustedGuardian.ps1 和证书的所在目录
- 运行 Import-UntrustedGuardian.ps1
- 输入导出证书时设置的密码
- 导入成功后,证书会保存在和 Export-UntrustedGuardian.ps1 相同的目录
温馨提示
建议在装好系统,首次开启虚拟机的 TPM 后,马上导出 vTPM 所使用的证书,以免系统崩坏之后无从备份。不需要每次开启虚拟机的 TPM 都要导出一次证书。
后记
就像 Windows 7 改进了 Windows XP 加密文件系统容易让用户丢失加密密钥一样,希望微软在 Hyper-V 的控制台中也增加导出 vTPM 证书的入口,毕竟现在的设计的确对初学者和粗心的人不太友好,万一虚拟机中存储了绝不能丢失的信息,那就损失大了。