【问题标题】:How to export private key from Windows Certificate Manager?如何从 Windows 证书管理器导出私钥?
【发布时间】:2019-01-24 23:10:01
【问题描述】:

我正在 Windows 环境中进行开发。

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

使用证书管理器我可以导出证书。但是,当从证书管理器中导出证书时,“导出私钥”单选按钮是灰色的。

有人有什么建议吗?

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

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

谢谢!

【问题讨论】:

标签: javascript node.js ssl https pki


【解决方案1】:

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

我们需要导出 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,我们将这两个证书导入到本地计算机\个人

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

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

在 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 在第一个破折号 (-) 之后。命令语法是这样的:

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 工具:

为了将 PFX 转换为 node.js 的 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 的安装位置,相应地编辑路径。

【讨论】:

【解决方案2】:

我遇到了同样的问题。

使用 CMD 运行命令

 certutil –repairstore my serialnumber

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

例子

certutil –repairstore my 25oA445521C8E9

更多详情

Check the link

【讨论】:

    【解决方案3】:

    可能的原因有:

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

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

    3. 再次假设您的 CA 是 Microsoft,如果您使用证书管理器中的 高级操作 -> 自定义请求... 选项并选择 在没有注册政策的情况下继续,您没有在证书属性私钥标签下启用使私钥可导出对话。

    【讨论】:

    • 非常感谢@garethTheRed。我的队友将证书和密钥转换为 .pem,这是我做错的事情,但并非一切正常。
    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-05-16
      • 2014-08-28
      • 2013-03-29
      • 2014-06-11
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多