现在是 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-PfxData
:OtherCertificates
和EndEntityCertificates
如果我尝试直接使用 导入证书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
对象(多个包装器)X509Certificate2
s) 进入存储。
由于what 返回的OtherCertificates
和属性是s 的数组,因此可以简单地将它们连接在一起并转换为要合并到存储中的EndEntityCertificates
Get-PfxData
X509Certificate2
X509Certificate2Collection