Ошибка развертывания сервисов команды 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:
$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