【问题标题】:PFX import failure...?PFX 导入失败...?
【发布时间】:2018-10-12 19:39:45
【问题描述】:

我有一个 .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 会话。

我做错了什么?谢谢。

【问题讨论】:

  • OpenVPN在什么账户下运行?通过 PowerShell 导入 PFX 后,该帐户是否有权访问私钥?
  • OpenVPN 作为本地系统运行,所以我假设它可以访问私钥。据我了解,由于我使用的是 LocalMachine 根存储,因此私钥应位于 C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys 中。我在那里看到一个文件,我认为它是正确的,因为它的“修改”属性上有正确的时间戳。

标签: powershell openssl ssl-certificate x509certificate2


【解决方案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"

【讨论】:

  • 这是 MachineKeySet 标志。当我添加它时,OpenVPN 开始工作。 $cert.import("$env:TEMP\$site.pfx", $certPassword, "MachineKeySet,PersistKeySet")。谢谢。
  • 我非常恼火的是 PowerShell 加密 cmdlet 在当今时代不提供这些功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
  • 2016-04-07
  • 2018-03-17
  • 2020-03-04
  • 2014-03-28
  • 2016-07-14
  • 2018-06-07
相关资源
最近更新 更多