我有一个 Windows 10 映像,其中包含主应用程序要使用的证书。但是,在映像上运行后sysprep /generalize
,证书的私钥似乎已被销毁。
如果我运行certlm.msc
,然后在个人\证书中,右键单击我的证书并选择“管理私钥......”我收到错误:
未找到证书的密钥!
此外,如果我尝试导出,它会告诉我
注意:找不到关联的私钥。只能导出证书。
另一方面,在 Sysprep 之前,我可以“管理私钥”,并且导出告诉我“关联的私钥被标记为不可导出”
我也读过这里该私钥确实在 sysprep 之后丢失了。
私钥存储在哪里?我该如何防止或解决这个问题?例如,是否可以在 Sysprep 之前保存私钥,然后将其复制回原来的位置?设备上的用户现在有不同的 SID,这有关系吗(也许私钥与特定的 SID 绑定)?
我已经阅读了有关此内容的内容,并且各种网站都向我指出了它们可能存在的几个位置:
C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
- 这里有两个文件。在 sysprep 之后,会创建第三个文件。第三个文件与原来的两个文件之一具有相同的前缀。(我尝试删除第三个文件,但没有帮助)
C:\ProgramData\Microsoft\Crypto\Keys
- 此目录在 sysprep 之前和之后都是空的。
编辑:我检查了每个子目录Crypto
,它们在 sysprep 之前和之后都是相同的。
C:\Users\MyUserName\AppData\Roaming\Microsoft\Crypto\RSA\{{SID}}
- Crypto
Sysprep 之前或之后该目录不存在。
C:\Users\MyUserName\AppData\Roaming\Microsoft\SystemCertificates\My\Certificates
Sysprep 前后均为空。
编辑
我还检查了注册表,HKLM\SOFTWARE\Microsoft\SystemCertificates\MY\Certificates
发现一个证书的指纹与问题证书的指纹相匹配。我还发现HKLM\SOFTWARE\Microsoft\SystemCertificates\MY\Keys
一个密钥与我的证书的“主题密钥标识符”相匹配,它也包含一个值。不幸的是,在 sysprep 之前和之后,两者也是相同的。
答案1
此问题已在非 Microsoft 错误报告中得到解决 系统准备后丢失私钥 #129,其中最后一项解释了该问题:
公钥(通常)写入注册表,私钥写入文件(除非导出到 PFX,否则绝不会存储在一起),与系统/机器文件或用户数据一起。关键是它只是由 .Net 对象“链接”,但实际上根本不是同一件事,并且存储方式不同。
当证书请求仍存储有所有信息时,/repairstore 可以修复该问题。但 sysprep 会破坏个人数据以通用化机器,因此我认为它丢失了。即使文件仍在那里,由于权限问题,它也可能无法访问。
无论如何,直到 .Net 4.8(使用 GetRSAPrivateKey())为止,没有简单的方法来获取私钥,而且我还没有找到一种很好的方法来查找私钥是否真的在系统上可用(我们可以每 15 分钟运行一次)。在
那之前,我们在资源方面能做的事情不多。
结论:没有解决方案。您可能能够向映像添加可以重新安装证书的安装后任务。