Ошибка развертывания сервисов команды Visual Studio / сертификата buildt

Я пытаюсь создать приложение с одним щелчком мыши, используя функцию непрерывной интеграции и развертывания в VSTS (интерактивные сервисы Visual Studio). Мы пытаемся создать это приложение с помощью размещенного агента Visual Studio 2015. У нас возникли трудности при подписании файла ключа строгого имени с помощью ошибка

MSB3326: Cannot import the following key file: xxxx.snk. The key file may be password protected. To correct this, try to import the certificate again or import the certificate manually into the current user's personal certificate store.И после этого

MSB3321: Importing key file "xxxx.pfx" was canceled.

Я пытался как выбрать из магазина, так и из файла, изменил местоположение и сделал коммит, но безуспешно. Любые идеи, как я могу преодолеть эту ошибку или что я делаю не так.

Очистка по выбранному ответу

Просто хотел сделать разъяснение, если у кого-то еще есть такая же проблема, в дополнение к ответу я должен был поместить свой сертификат в мой код контроля исходного кода и зафиксировать его. Затем, чтобы выбрать его местоположение, добавьте глобальную переменную в VSTS Build.

$cert.Import("$(CertPath)", $password, [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]"PersistKeySet")Где $(CertPath) будет что-то вроде $(Build.SourcesDirectory)\SharedSolutionFiles\CertificateName.pfx

4 ответа

Решение

Вы можете создать сценарий PowerShell и добавить шаг PowerShell Script в определение сборки, чтобы импортировать файл сертификата до шага VSBuild.

Сбой сборки без PowerShell Import Certificate Шаг: введите описание изображения здесь

Сборка прошла с помощью PowerShell Import Certificate. Шаг: введите описание изображения здесь

Скрипт PowerShell, который я использовал:

$pfxpath = 'pathtoees.pfx'
$password = 'password'

Add-Type -AssemblyName System.Security
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
$cert.Import($pfxpath, $password, [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]"PersistKeySet")
$store = new-object system.security.cryptography.X509Certificates.X509Store -argumentlist "MY", CurrentUser
$store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]"ReadWrite")
$store.Add($cert)
$store.Close()

Лучший способ заключается в том, что вы можете настроить локальный агент сборки и импортировать сертификат в хранилище сертификатов, а затем изменить учетную запись службы агента сборки на ту же учетную запись.

После того, как я не смог использовать методы в других ответах, я нашел другой способ использовать сценарий PowerShell для импорта сертификата pfx. мой сценарий был написан для GitHub Actions, но вы можете легко изменить синтаксис на VSTS или конвейер Azure ( например, используя «task: [email protected] » для конвейера azure).Вы также можете обновить путь к файлу с github на путь devops. Также пароль можно заменить защищенной переменной.

      - name: Import certificate from the command-line
  shell: pwsh
  run: |
    $Secure_String_Pwd = ConvertTo-SecureString "<password>" -AsPlainText -Force
    Import-PfxCertificate -FilePath '${{github.workspace}}\<path>\project1_TemporaryKey.pfx' -CertStoreLocation Cert:\CurrentUser\My -Password $Secure_String_Pwd

Затем создайте свой проект Visual Studio ClickOnce. Ошибка должна исчезнуть.

После сборки вы можете удалить сертификат с машины. Вот пример PowerShell, предоставленный Microsoft:

https://learn.microsoft.com/en-us/answers/questions/360772/powershell-commands-to-delete-personal-certificate.html

       $users = "user1","user2","user3","user4","user5"
 Get-ChildItem Cert:\CurrentUser\My | ForEach-Object {
     $ifkeep = $false
     foreach($user in $users){
         if($_.Subject -match $user){
             $ifkeep = $true
             break
         }
     }
     if($ifkeep -eq $false){
         Remove-Item $_
     }
 }

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

Я изложил шаги здесь: /questions/47742818/bezopasnaya-podpis-prilozhenij-clickonce-v-konvejere-azure-devops/49416310#49416310

Другие вопросы по тегам