VSTS - Как преобразовать сертификат клиента, полученный из хранилища ключей Azure, в экземпляр Powershell X509Certificate

Чтобы дать немного предыстории, у нас есть проект WebAPI, защищенный аутентификацией сертификата клиента.

Один из наших шагов сборки и выпуска - вызвать один из наших собственных API-интерфейсов с помощью Powershell, но нам нужно добавить сертификат, чтобы этот вызов работал.

Мы используем приведенную ниже задачу для получения секрета, управляемого Azure (фактический самозаверяющий сертификат, созданный непосредственно в Key Vault).

https://docs.microsoft.com/en-us/vsts/build-release/tasks/deploy/azure-key-vault?view=vsts

Задаче удалось вернуть сертификат и поместить его в переменную, но мы не смогли преобразовать эту переменную, которая на странице выше говорит, что это строковое представление, в фактический экземпляр X509Certificate, который ожидает Invoke-WebRequest.

Ошибка, которую мы получаем в процессе выпуска VSTS, приведена ниже:

2018-05-16T19:33:12.2384270Z ##[error]Cannot bind parameter 'Certificate'. Cannot convert value "***" to type "System.Security.Cryptography.X509Certificates.X509Certificate". Error: "The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters."

2018-05-16T19:33:12.2398107Z ##[debug]Processed: ##vso[task.logissue type=error]Cannot bind parameter 'Certificate'. Cannot convert value "***" to type "System.Security.Cryptography.X509Certificates.X509Certificate". Error: "The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters."

2018-05-16T19:33:12.2399696Z ##[debug]Processed: ##vso[task.complete result=Failed]

2018-05-16T19:33:12.2611215Z ##[section]Finishing: Azure PowerShell script: API Validation

На данный момент я даже не уверен, какое значение получает сборка от задачи. Это строка, защищенная строка или что-то в этом роде? И как преобразовать это в X509Certificate?

Invoke-WebRequest документация показывает, что ключ -Certificate ожидает сертификат типа X509.

[-Certificate <X509Certificate>]

Я уже видел в Интернете некоторый код, который показывает, как преобразовать получение сертификата из Key Vault, но это получение его напрямую с помощью Azure CmdLets и получение возвращаемого значения байтов, а не строкового представления, как это делает задача VSTS.

$PFXPath = 'mycert.pfx'
$PFXPassword = ''
$PFX = New-Object -TypeName 'System.Security.Cryptography.X509Certificates.X509Certificate2Collection'
$PFX.Import($PFXPath,$PFXPassword,[System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::PersistKeySet)
$PFX

Сказав все это, знает ли кто-нибудь, как преобразовать сертификат, полученный с помощью задачи VSTS (которая возвращает строковое представление), в единственный экземпляр сертификата X509, который я могу передать вызову Powershell Invoke-WebRequest?

Любая помощь приветствуется, спасибо.


person GR7    schedule 23.05.2018    source источник
comment
Вы решаете эту проблему?   -  person starian chen-MSFT    schedule 28.05.2018
comment
Привет @ starianchen-MSFT, мы в процессе. На самом деле решение Адриано работает при локальном запуске кода. Проблема, с которой мы сталкиваемся, связана с получением сертификата из KeyVault с помощью задачи VSTS. Я опубликую точное решение, когда мы его исправим.   -  person GR7    schedule 31.05.2018


Ответы (1)


Ссылка на документацию, которую вы предоставили (https://docs.microsoft.com/en-us/vsts/build-release/tasks/deploy/azure-key-vault?view=vsts#arguments), похоже, отвечает на ваш вопрос (сертификат кодируется как строка base64):

Если значение, полученное из хранилища, является сертификатом (например, файлом PFX), переменная задачи будет содержать содержимое PFX в строковом формате. Вы можете использовать следующий код PowerShell для получения файла PFX из переменной задачи:

$kvSecretBytes = [System.Convert]::FromBase64String($(PfxSecret))
$certCollection = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2Collection
$certCollection.Import($kvSecretBytes,$null,[System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable)
person Adriano    schedule 23.05.2018
comment
Спасибо Адриано. Вы правы, этот код работает локально, но каким-то образом возвращаемое значение из задачи VSTS не конвертируется должным образом. Я подтвердю, как только мы исправим это в ближайшие пару дней. - person GR7; 31.05.2018