恢复私钥被标记为不可导出的证书
我们需要导出 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-363efe3adaed
然后使用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 文件夹并在其中复制以下项目:
- 私钥文件 (.key)
- 证书文件 (.pem)
- 授权证书文件 (.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 的安装位置,相应地编辑路径。