PFX 导入失败...?

PFX import failure...?

我有一个 .crt 和 .key 文件,我正在使用 OpenSSL 从中创建一个 .pfx 文件。我正在尝试使用 PowerShell 将 .pfx 文件导入 Cert:\LocalMachine\My,然后我会将该证书用于 OpenVPN。使用以下代码,我在导入时没有收到任何错误:

$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
$cert.import("$env:TEMP$site.pfx", $certPassword, "PersistKeySet")
$store = New-Object System.Security.Cryptography.X509Certificates.X509Store("My", "LocalMachine")
$store.open("MaxAllowed")
$store.add($cert)
$store.close()

我可以在 MMC 中看到证书,但 OpenVPN 的日志文件显示:

error:C5066064:microsoft cryptoapi:CryptAcquireCertificatePrivateKey:Keyset does not exist

我尝试将 $certPassword 作为字符串和安全字符串。当我通过 GUI 导入证书时(从 $certPassword 的内容中复制密码),OpenVPN 正常启动。

我也试过这段代码,但看到了同样的行为:

Import-PfxCertificate -Password ($certPassword | ConvertTo-SecureString -AsPlainText -Force) -CertStoreLocation Cert:\LocalMachine\My -FilePath $env:temp$site.pfx

最后,我 运行 PowerShell 会话提升了。

我做错了什么?谢谢

由于您要将证书添加到 LocalMachine\My 存储区,因此您可能希望使用 X509KeyStorageFlags.MachineKeySet

导入它

可能是

$cert.import("$env:TEMP$site.pfx", $certPassword, "PersistKeySet | MachineKeySet")

但我实际上并不了解 PowerShell,所以我不知道标志语法。

第二种可能是 PFX 导入将密钥保存在 CNG 下,但 OpenVPN 没有使用 "I know what CNG means" 标志。您可以通过在使用 openssl

构建 PFX 时指定 CSP 值来使导入加载 CAPI 中的密钥
openssl pkcs12 -export ... -CSP "Microsoft Enhanced RSA and AES Cryptographic Provider"