Чтобы дать немного предыстории, у нас есть проект 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?
Любая помощь приветствуется, спасибо.