通过 PowerShell 导入具有完整证书链的 PFX 证书

通过 PowerShell 导入具有完整证书链的 PFX 证书

现在是 SSL 证书更换时间了,虽然对于我的 Windows 服务器,我可以以繁琐的方式执行此操作(证书 mmc,手动导入),但我正在寻找可以通过一些 PowerShell 脚本自动执行的操作。

我知道导入 PfxCertificate,并导入 .pfx 我会做类似的事情:

$pwd = ConvertTo-SecureString -String "PrivateKeyPasswordGoesHere" -AsPlainText -Force
Import-PfxCertificate -Password $pwd -FilePath "\\path\to\pfxfile\pfxfile.pfx" -CertStoreLocation Cert:\LocalMachine\My -Exportable # optional if i want the private key to be exportable

这一切都很好,但与手动繁琐的方式不同,它仅引入实体证书本身;它不会引入完整链中的任何其他证书(根证书,中间证书等)。

看起来好像我也许可以做点什么获取 PfxData, 哪个 ”将个人信息交换 (PFX) 文件的内容提取到包含最终实体证书、任何中间证书和根证书的结构中“, 但进口证书有一个强制性的 FilePath 参数,所以我无法将 Get-PfxData 的输出通过管道传输给它。

我使用 Get-PfxData 来验证 PFX 确实包含完整的链

我也尝试过以下方法:

  • 手动导入到证书 mmc。
  • 使用 Export-PfxCertificate 导出完整链(必须假定它采用 Import-PfxCertificate 可使用的格式)。
  • 使用 Import-PfxCertificate 导入导出的证书。

但是,Import-PfxCertificate 并没有引入完整的链。

还有其他办法可以解决这个问题吗?

答案1

如果完整证书链是 PFX 文件的一部分,Import-PfxCertificate也将导入所有相关证书并将它们放入适当的文件夹中。

您无需再做任何事。

答案2

我最终使用证书 mmc 手动完成了此操作。

最终,似乎没有足够的保证表明 PowerShell 方法可以重现与 mmc 相同的行为,而对于业务关键型应用程序,使用 mmc 的保证足够重要,足以承受时间和精力的打击。

答案3

我也测试了这一点,确实Import-PfxCertificate导入了链,但如果链证书已经存在(我的情况就是如此),它们就不会显示在个人证书中。我能够将我的 pfx 绑定到我的网站,一切正常。

答案4

由于您没有包含 的输出Get-PfxData,我不确定我的解决方案是否适用于您的问题。但这是我的:

PS> Get-PfxData -FilePath "\\path\to\cert.p12" -Password $pwd | Format-List

OtherCertificates     : {[Subject]
                          CN=mkcert MSEDGEWIN10\IEUser@MSEDGEWIN10 (IEUser), OU=MSEDGEWIN10\IEUser@MSEDGEWIN10 (IEUser), O=mkcert development CA
                         ...
                        }
EndEntityCertificates : {[Subject]
                          CN=localhost, OU=MSEDGEWIN10\IEUser@MSEDGEWIN10 (IEUser), O=mkcert development certificate
                         ...
                        }

值得注意的是,返回两个证书数组Get-PfxDataOtherCertificatesEndEntityCertificates

如果我尝试直接使用 导入证书Import-PfxCertificate Cert:\CurrentUser\Root -FilePath "\\path\to\cert.p12" -Password $pwd,则只有 中的证书EndEntityCertificate会进入所需的Cert:\CurrentUser\Root。 中的证书OtherCertificates反而会进入Cert:\CurrentUser\CA并且不受信任


为了解决这个问题,我最终不得不直接调用.NET 函数(PowerShell 提供了方便的访问),并明确编辑存储:

$store = Get-Item Cert:\CurrentUser\Root
$store.Open([Security.Cryptography.X509Certificates.OpenFlags]::ReadWrite)
$cert = Get-PfxData -FilePath "\\path\to\cert.p12" -Password $pwd
$store.AddRange([Security.Cryptography.X509Certificates.X509Certificate2Collection]::new($cert.EndEntityCertificates + $cert.OtherCertificates))

这是如何工作的?
Get-Item证书存储区返回X509Store对象,它具有AddRange()可以让你合并X509Certificate2Collection对象(多个包装器)X509Certificate2s) 进入存储。
由于what 返回的OtherCertificates和属性是s 的数组,因此可以简单地将它们连接在一起并转换为要合并到存储中的EndEntityCertificatesGet-PfxDataX509Certificate2X509Certificate2Collection

相关内容