PS 脚本证书导入的私钥已损坏

Imported by PS script certificate has broken Private Key

我正在 运行宁 CI Azure DevOps 集成测试,运行宁发生在安装了构建代理的专用 Azure VM 上。这些测试需要在该 VM 上安装客户端 SSL 证书。作为 CI 中的构建步骤,我有一个 PS 脚本,该脚本使用 Azure KeyVault 证书并将其导入到 VM 的 LocalMachine/My 存储中。虽然导入了证书并且我可以在 VM 中看到它,但来自 CI 的测试使用该证书失败。请注意,当尝试在 VM 中手动导出时,证书的 Export with Private Key 选项变灰。

当我 运行 使用 VM 手动执行相同的 PS 脚本,然后 运行 CI 测试(禁用 PS 步骤)时,消费者测试成功证书和通行证。

我应该在下面的 PS 脚本中更改什么,以便它(远程 运行ning)将使用 Export with Private Key 导入证书启用选项?

$vaultName = "MyKeyVault-stest"
$secretName = "MyCertificate"

$kvSecret = Get-AzureKeyVaultSecret -VaultName $vaultName -Name $secretName
$kvSecretBytes = [System.Convert]::FromBase64String($kvSecret.SecretValueText)

$kvSecretPass = 'myPass'

#-----------------------------------------------------------------------------


$pfxCertObject=New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 -ArgumentList @($kvSecretBytes, "", [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable)

$newcertbytes = $pfxCertObject.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::Pkcs12, $kvSecretPass)

$newCert=New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
$newCert.Import($newcertbytes,$kvSecretPass,[System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable)

#-------------------------------------------------------------------------------

$certStore = Get-Item "Cert:\LocalMachine\My"
$openFlags = [System.Security.Cryptography.X509Certificates.OpenFlags]::ReadWrite
$certStore.Open($openFlags) 
$certStore.Add($newCert) 

Write-host $env:USERNAME
Write-host $(whoami)

如果要导入 PFX 以将其添加到持久存储中,则需要指定 X509KeyStorageFlags.PersistKeySet 标志。如果你不这样做,在以后某个不确定的时间点,垃圾收集器会注意到没有人关心密钥,然后要求 Windows 删除它......然后添加到 X509Store 的版本将无法再找到它的密钥。

其他阅读: