Сертификат, импортированный с помощью сценария PS, сломал закрытый ключ

Я запускаю интеграционные тесты CI в Azure DevOps, запуск происходит на выделенной виртуальной машине Azure с установленным агентом сборки. Эти тесты требуют, чтобы на этой виртуальной машине был установлен клиентский SSL-сертификат. В качестве этапа сборки в CI у меня есть сценарий PS, который использует сертификат Azure KeyVault и импортирует его в LocalMachine / My store of VM. Хотя сертификат импортирован, и я вижу его в виртуальной машине, тесты из CI не работают с использованием сертификата. Обратите внимание, что для сертификата при попытке экспорта в виртуальную машину вручную параметр Экспорт с закрытым ключом неактивен.

Когда я запускаю тот же сценарий 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)

person Takhir Mamirov    schedule 16.01.2019    source источник


Ответы (1)


Если вы импортируете PFX, чтобы добавить его в постоянное хранилище, вы хотите указать флаг X509KeyStorageFlags.PersistKeySet. Если вы этого не сделаете, в какой-то неопределенный момент позже сборщик мусора замечает, что никто не заботится о ключе, и затем просит Windows удалить его ... а затем версия, добавленная в X509Store, больше не может найти свой ключ.

Другое чтение:

person bartonjs    schedule 16.01.2019