繁体   English   中英

如何从 Windows 证书管理器导出私钥?

[英]How to export private key from Windows Certificate Manager?

我正在 Windows 环境中开发。

我的公司是内部使用的 https 应用程序的自己的证书颁发机构,我已经从我们的系统中获得了证书(对于我构建的仅供内部使用的 Web 服务器)。

使用证书管理器,我可以导出证书。 但是,从证书管理器导出证书时,“导出私钥”单选按钮变灰。 <-- 我试图解决这个问题,但没有成功。

有没有人有什么建议?

我正在 Node JS 中开发(使用 express)。

没有这个,我无法为 https.createServer 配置 sslOptions 对象。

谢谢!

恢复私钥被标记为不可导出的证书

我们需要导出 IIS7 SSL 证书的私钥,以便将其导入在同一域下的不同端口上运行的 node.js HTTPS 项目中。

我们意识到证书已经失去了导出私钥的能力 该证书最近使用旧 CSR 重新颁发,但不知何故,新证书的私钥被标记为不可导出,而过去的证书具有可导出的私钥。 幸运的是,我们有一个以前的证书,可以使用可导出的私钥来使用。 互联网上有一些指南表明,以下过程可能在没有旧证书的情况下工作,但在我们的情况下却没有,可能是因为证书已重新颁发。

免责声明:以下过程不会侵入您的计算机,并且需要使用 VM。 如果成功,那么您将导出您的私钥。 如果失败,那么您唯一的选择是使用可导出的私钥创建 CSR 并重新颁发您的证书并重新配置您的域。

我们使用 mmc 在本地计算机\\个人中导入了两个证书。

注意:您导入证书的位置很重要!

在此处输入图片说明

我们使用不可导出的私钥找到了证书的指纹:

在此处输入图片说明

在这个示例中,拇指是 693867F321B5764E324F3FB8C5CBCE03CDA3C2A3。

重要提示:拇指必须大写!!!

此时,根据问题的根本原因,我们建议启动命令提示符并输入以下命令,因为它可能会解决您的问题:

certutil -repairstore my 693867F321B5764E324F3FB8C5CBCE03CDA3C2A3

如果问题没有解决并且私钥仍然不可导出,请继续...

我们使用 PowerShell 识别了私钥存储并复制到 C:\\

在此处输入图片说明

$a = get-item cert:\LocalMachine\My\693867F321B5764E324F3FB8C5CBCE03CDA3C2A3
$a.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName

此命令显示私钥存储为:

00998a33dbff25a91050b3b1bf9001ef_a5968f4a-5244-4993-830a-363​​efe3adaed

然后使用NirSoft PsExec64,我们在系统帐户上启动了一个提升命令提示符,并使用 /G 和 /H 将密钥库复制/解密到 C:\\。

PsExec64.exe -s -i cmd
xcopy /G /H "C:\Users\All Users\Microsoft\Crypto\RSA\MachineKeys\00998a33dbff25a91050b3b1bf9001ef_a5968f4a-5244-4993-830a-363efe3adaed" c:\

在此处输入图片说明

我们创建了一个 VMware 并复制了证书和私钥存储:

在此处输入图片说明

我们使用 MMC 将两个证书导入到Local Computer\\Personal 中

在此处输入图片说明

在此处输入图片说明

在导入过程中,我们确保对于带有私钥的证书,我们将私钥标记为可导出:

在此处输入图片说明

所以,这两个证书都被导入了,但正如预期的那样,只有一个有锁图标,表明它有一个私钥:

在此处输入图片说明

在 VM 上使用 Power Shell,我们从 Microsoft Cryptography 获得了机器的 GUID,并使用此 GUID 将私钥存储复制到适当的位置。

Get-ItemProperty Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\ -Name MachineGuid

这返回:a73d2e44-7a45-486a-97d3-b9d97bf556fa。 在以下命令中,您需要用新的 GUID 替换旧计算机的 GUID,GUID 位于第一个短划线 (-) 之后。 命令语法是这样的:

Move-Item "C:\<certificate-store>_<old-computer-guid>" "C:\Users\All Users\Microsoft\Crypto\RSA\MachineKeys\<certificate-store>_<vm-computer-guid>"

因此,根据前面步骤中导出的标识符,它应该如下所示:

Move-Item "C:\00998a33dbff25a91050b3b1bf9001ef_a5968f4a-5244-4993-830a-363efe3adaed" "C:\Users\All Users\Microsoft\Crypto\RSA\MachineKeys\00998a33dbff25a91050b3b1bf9001ef_a73d2e44-7a45-486a-97d3-b9d97bf556fa"

然后我们使用有问题的证书的拇指运行 certutil 来修复它!

certutil -repairstore my 693867F321B5764E324F3FB8C5CBCE03CDA3C2A3

您应该会看到如下内容:

在此处输入图片说明

刷新 MMC 后,您将看到两个证书都有一个私钥图标:

在此处输入图片说明

因此,继续使用私钥导出证书:

在此处输入图片说明

SOS:确保您将私钥标记为可导出!!!

在此处输入图片说明

在此处输入图片说明

接下来将 PFX 文件复制回您的 node.js 服务器计算机并将其导入现有有问题的证书的顶部。

导入新证书后,您可以删除旧证书。

接下来从您的服务器重新导出证书,仅用于完整性检查。 您应该会看到不再变灰的导出私钥!

在此处输入图片说明

SOS:确保您将私钥标记为可导出!!!

在此处输入图片说明

为了导出 node.js 的私钥,我们使用了 DigiCert Utility 工具:

在此处输入图片说明

为了将 node.js 的 PFX 转换为 PEM,我们使用了 OpenSSL:

openssl pkcs12 -in www_xxx_com.pfx -clcerts -nokeys -out www_xxx_com.pem

要使用证书是 node.js 在您的 node.exe 路径中创建一个 SLL 文件夹并在其中复制以下项目:

  1. 私钥文件 (.key)
  2. 证书文件 (.pem)
  3. 授权证书文件 (.crt)

注意:授权证书文件与您的证书提供商的证书一起提供。

在此处输入图片说明

最后,您可以使用以下代码加载证书和私钥:

  var https_options = {
    key: fs.readFileSync("C:\\nodejs\\ssl\\www_xxx_com.key"),
    cert: fs.readFileSync("C:\\nodejs\\ssl\\www_xxx_com.pem"),
    ca: [
      fs.readFileSync('C:\\nodejs\\ssl\\DigiCertCA.crt')      
    ]
  };
  require('https').createServer(https_options, app).listen(PORT);

或者根据 node.js 的安装位置,相应地编辑路径。

我遇到过同样的问题。

使用 CMD 运行命令

 certutil –repairstore my serialnumber

您可以从证书详细信息选项卡中找到序列号。 在运行命令之前删除所有空格。

例子

certutil –repairstore my 25oA445521C8E9

更多细节

检查链接

可能的原因有:

  1. 如果您的 CA 不是 Microsoft 的(或者即使是,但您在另一个盒子上创建了证书),您只导出证书,而不导出私钥。 对于 Windows,这意味着您必须导出/导入.pfx.p12文件(组合证书和私钥),而不是.cer.crt文件(仅限证书)。

  2. 假设您的 CA 是 Microsoft 的 CA,则用于颁发证书的模板上未启用允许导出私钥

  3. 同样,假设您的 CA 是 Microsoft,如果您使用证书管理器中的Advanced Operations -> Custom Request...选项并选择Proceed without registration policy ,则您没有在Private Key选项卡下启用Make private key exportable证书属性对话框。

可能缺乏访问权限,我的意思是您的密钥文件已存储在“ C:\\ProgramData\\Microsoft\\Crypto\\RSA\\MachineKeys ”,并且有可能测试某些方法,您删除了机器密钥并将它们作为备份,在测试场景后,您需要恢复那些文件,您必须提供对每个文件用户的访问权限,例如“每个人”、“系统”、“管理员”、“ IIS_IUSR ”等...

在此之后,可以在您的 IIS 中访问这些证书以将它们分配给任何托管站点,

我遇到了同样的问题,我删除了机器密钥,一旦服务器重新启动,这些密钥就会生效,一旦服务器重新启动,您关联的 SSL 证书将自动删除,因为系统无法访问这些文件,在这种情况下,我们必须手动提供访问权限

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM