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

时间:2019-01-16 09:18:20

标签: azure-devops ssl-certificate private-key

我在Azure DevOps中运行CI集成测试,运行在安装了构建代理的专用Azure VM上。这些测试要求在该VM上安装客户端SSL证书。作为CI的构建步骤,我有一个PS脚本,该脚本使用Azure KeyVault证书并将其导入到VM的LocalMachine / My存储中。虽然导入了证书,但我可以在VM中看到它,但是使用证书无法从CI进行测试。请注意,在尝试在VM中手动导出时,证书的带私钥导出选项显示为灰色。

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

我应该在下面的PS脚本中进行哪些更改,以便它(正在远程运行)将导入启用了导出并带有私钥选项的证书?

$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)

1 个答案:

答案 0 :(得分:0)

如果要导入PFX以将其添加到持久存储中,则要指定X509KeyStorageFlags.PersistKeySet标志。如果您不这样做,则垃圾回收器在某个不确定的点之后会发现没人在乎该密钥,然后要求Windows删除它...然后添加到X509Store的版本将无法再找到其密钥。

其他阅读: