PFX导入失败......?

时间:2018-05-02 16:04:49

标签: powershell openssl ssl-certificate x509certificate2

我有一个.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的日志文件显示:

  

错误:C5066064:microsoft cryptoapi:CryptAcquireCertificatePrivateKey:Keyset不存在

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

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

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

最后,我正在运行PowerShell会话。

我可能做错了什么?感谢。

1 个答案:

答案 0 :(得分:1)

由于您要将证书添加到LocalMachine \ My商店,您可能希望使用X509KeyStorageFlags.MachineKeySet

将其导入

那可能是

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

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

第二种可能性是PFX导入在CNG下保存了密钥,但是OpenVPN没有使用"我知道CNG意味着什么"旗。通过在使用openssl构建PFX时指定CSP值,可以使导入加载CAPI中的键

openssl pkcs12 -export ... -CSP "Microsoft Enhanced RSA and AES Cryptographic Provider"