我尝试了以下方法通过 PowerShell 将证书导入本地计算机存储。控制台以管理员身份运行。
Import-PfxCertificate -Exportable -Password (secure.string) -CertStoreLocation Cert:\LocalMachine\My -FilePath 'certificatepath.pfx'
我也试过
$PFXFile = certificatepath.pfxc
$PFXPassword = secure.string
$PFXObject = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Certificate2($PFXFile, $PFXPassword, [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable)
$CertificateStore = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Store('My','LocalMachine')
$CertificateStore.Open('MaxAllowed')
$CertificateStore.Add($PFXObject
$CertificateStore.Close()
问题是,两种方法都不起作用。在这两种情况下,它确实出现在 LocalMachine 存储中,但看起来有与之关联的私钥,即使 PFX 文件确实有它。
如果我通过 MMC 控制台导入同一个文件,它可以正常加载。通过 PowerShell,会出现以下事件
Level: Error
Source: Schannel
Event Id: 36870
Message: A fatal error occurred when attempting to access the TLS server credential private key. The error code returned from the cryptographic module is 0x8009030D. The internal error state is 10001.
附加信息:如果我对通过 MMC 导入的证书执行 Get-Item,则属性 PrivateKey 确实会列出信息。通过 PowerShell 导入,但不存在。
如果重要的话,操作系统是 Server 2019。
答案1
使用第二种方法,如果为 $PfxObject 设置"Exportable,MachineKeySet,PersistKeySet"
导入标志会发生什么?只需使用字符串作为选项:
$PFXObject = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Certificate2($PFXFile,$PFXPassword,"Exportable,MachineKeySet,PersistKeySet")
如果这没有帮助,也许可以尝试将密码仅作为常规字符串。
如果它与这些导入标志一起工作,也许可以删除该证书并在没有的情况下重试PersistKeySet
。
我个人需要进行一些反复试验才能确定何时PersistKeySet
需要。但如果您的流程不需要该选项(包括在不同的机器上进行全新测试),那么最好省略不必要的参数。