普通视图

发现新文章,点击刷新页面。
昨天以前首页

无法打开虚拟机的密钥保护器。 .详细信息包含在 HostGuardianService-Client 事件日志中。咋办?备份 Hyper-V 的虚拟 TPM 证书

作者 Armstrong
2023年6月2日 16:59

  众所周知安装 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 本地证书”),右键点击证书,然后指向所有任务👉导入。

  1. 在向导的欢迎页面,点击“下一步”。
  2. 浏览到保存的证书,然后点击“下一步”。提是:需要在浏览文件的对话框的“文件类型”中选择“个人信息交换”,否则是看不到证书文件的。
  3. 在“私钥保护”页面,输入导出证书时设置的密码,勾选“将此密钥标记为可导出。这将允许您在以后备份或传输您的密钥”复选框,否则下次重装系统之前,你就没办法导出证书的私钥了,切记!
  4. 在“证书存储”页面,直接点击“下一步”。
  5. 这是最终确认的页面,确认无误,点击“完成”。

使用 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

使用方法

导出

  在要导出证书的机器上:

  1. 以系统管理员的身份打开 Powershell
  2. 运行 Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
  3. 用 cd 命令导航到 Export-UntrustedGuardian.ps1 的所在目录
  4. 运行 Export-UntrustedGuardian.ps1
  5. 为密钥设置一个密码,这里和图形界面不同的是不强制输入密码
  6. 导出成功后,证书会保存在和 Export-UntrustedGuardian.ps1 相同的目录

导入

  在要导入证书的机器上安装 Hyper-V,然后:

  1. 以系统管理员的身份打开 Powershell
  2. 运行 Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
  3. 用 cd 命令导航到 Import-UntrustedGuardian.ps1 的所在目录,这里也是 Export-UntrustedGuardian.ps1 和证书的所在目录
  4. 运行 Import-UntrustedGuardian.ps1
  5. 输入导出证书时设置的密码
  6. 导入成功后,证书会保存在和 Export-UntrustedGuardian.ps1 相同的目录

温馨提示

  建议在装好系统,首次开启虚拟机的 TPM 后,马上导出 vTPM 所使用的证书,以免系统崩坏之后无从备份。不需要每次开启虚拟机的 TPM 都要导出一次证书。

后记

  就像 Windows 7 改进了 Windows XP 加密文件系统容易让用户丢失加密密钥一样,希望微软在 Hyper-V 的控制台中也增加导出 vTPM 证书的入口,毕竟现在的设计的确对初学者和粗心的人不太友好,万一虚拟机中存储了绝不能丢失的信息,那就损失大了。

Windows 10下新加的硬盘不能使用Bitlocker,和TPM的问题

作者 Eric
2023年12月6日 11:42

我工作电脑上有额外的一块硬盘,存一些和工作无关的个人的资料。主要是有时候会收集一些自己用的资料,比如给娃看的视频资料,我自己看的电子书视频之类,平常工作的时候BitLocker锁住,需要用的时候就输入密码打开--我自己独立办公室,也不会有人用我的电脑,这么操作纯粹是比较方便。而且自己工作的时候习惯用listary随时搜本机的图纸资料,锁住以后个人资料就不会被搜到,纯工作环境比较清爽。说了这么多感觉确实有点越盖弥彰,解释就是掩饰了--简而言之,就是我需要用Bitlocker锁住我工作电脑的个人资料硬盘。

以前这么用过很久,没有问题。前一阵机器重装了,我换了一块闲置的固态硬盘上去当个人资料盘。奇怪的事情出现了,系统所在的硬盘的两个盘都有Bitlocker选项,但是我这块新加的固态硬盘没有Bitlocker的选项。百度谷歌抖音油管搜了一圈,可能是我这个用法太小众,只在谷歌上找到了一个英文的提问,但是没有回答。最后误打误撞在知乎上找了一个相近的问题,大致理解了Windows的TPM(Trusted Platform Module) :


TPM是什么?从学名上来说,它指的是“可信平台模块(Trusted Platform Module,TPM)”。但实际上,按照Windows系统中关于TPM的说法,我们完全可以将其简单称为电脑的“安全处理器”。

为什么这么说?因为TPM的作用主要是两点。第一是密钥计算,也就是用其内置的各种加密算法,生成或是核验电脑里的密码。这些密码可以是硬盘的加密锁,可以是操作系统用于校验自身完整性(检查程序是否被篡改)的特征码,也可以是某些专业软件的激活码,甚至用户平时网购的交易密码。

其次,TPM本身也是电脑里的一块加密存储单元,它不仅可以计算密钥,同时也可以存储密钥。并且由于TPM使用的是完全的专用电路,整个计算和存储的过程都可以不经过内存,并不会在硬盘中留下痕迹,所以密钥生成、核验及存储安全性非常之高。


以上摘自知乎。

简单来说TPM就是windows电脑用来计算和存储密钥的一个单元,新一点的电脑都带--有的是在主板上,有的是集成在其他芯片里。

Windows的系统密码和Bitlocker就依托于这个TPM。

不再展开了,再展开就露怯了,因为我只是大体了解。

回到问题本身,我的理解就是:我的个人硬盘是在系统重做以后加上去的,没有在windows 系统的TPM的信任的硬件里边,所以不能使用Bitlocker。解决办法就是清除TPM信息,系统重新启动以后会重设一遍,这块硬盘就会被加入到TPM,就可以使用Bitlocker了

Windows 10下新加的硬盘不能使用Bitlocker,和TPM的问题 - 第1张图片

需要注意的一点是,清除TPM重启windows以后,你的Windows Hello的PIN就得重设了,如果是用的笔记本,可能指纹也得重设。

❌
❌