我有一个.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会话。
我可能做错了什么?感谢。
答案 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"