VSTS. Как преобразовать полученное в хранилище ключей Azure сертификат клиента в экземпляр Powershell X509Certificate - PullRequest
0 голосов
/ 23 мая 2018

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

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

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

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

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

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

[-Certificate <X509Certificate>]

У меня естьв сети уже был виден некоторый код, показывающий, как преобразовать извлечение сертификата из хранилища ключей, но который извлекает его напрямую с помощью 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?

Любая помощь очень ценится, спасибо.

1 Ответ

0 голосов
/ 23 мая 2018

Ссылка на документацию, которую вы предоставили (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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...