2016-04-08 4 views
0

У меня есть проблема, которую я абсолютно не понимаю. Несколько дней назад я выпустил новый сертификат для кодов от нашего поставщика (GlobalSign).signtool выбирает неправильный (старый) сертификат для подписи кода

После входа в систему на сервере сборки с пользователем, который делает сборки/CodeSigning, я начал certmgr, переходите к Личном хранилище сертификатов и удален старый сертификат. Затем я использовал диалог «Импорт», чтобы импортировать новый сертификат, включая его закрытый ключ.

Испытательная сборка показала, что signtool по-прежнему использует сертификат для подписи приложения. Тем не менее, я не могу найти этот сертификат где-нибудь в certmgr, даже не проверив контрольную сумму SHA1.

Через некоторое Googling я нашел этот BlogPost: http://qualapps.blogspot.de/2008/07/installing-code-signing-certificate.html Он заявил следующее:

Удалите старый сертификат. Если вы обновляете существующий сертификат, то сохранение старых сертификатов обычно не приносит пользы, и наличие нескольких сертификатов будет нарушать SIGNTOOL, если signtool выполняет поиск в хранилище сертификатов. Перейдите в Панель управления/Свойства обозревателя/Контент, нажмите «Сертификаты», выберите старый сертификат и нажмите «Удалить». Старый сертификат, вероятно, будет на Личной странице, если вы разрешите PVKIMPRT решить, куда его поместить.

Я следовал этим инструкциям, но единственное, что я могу найти, это новый сертификат.

"мое название компании" - это имя, которое содержится как в старом, так и в новом сертификате.

a. Как узнать, где старый сертификат все еще хранится и удалить его? b. Как я могу заставить signtool использовать новый сертификат или, по крайней мере, терпеть неудачу ?!

+0

Я работал над этой проблемой, используя файл .pfx непосредственно вместо хранилища сертификатов, как описано в блоге Я прочитал: 'signtool.exe sign/f codesign.pfx/p PASSWORD -tr" http://www.startssl.com/timestamp "" Hello World.exe "' Найдено здесь: https: //www.pierschel .com/de/software-blog/18-code-signature-tutorial-de – Vertigo

ответ

1

Обходной путь с использованием файла PFX и ссылкой на него является хорошим решением.

Однако, вы можете попробовать следующее:

  • добавить параметр /s MY в цепочке параметров Signtool. Ссылки «MY» на личный магазин.

  • в certmgr.msc, смотрите в других магазинах, если они не содержат копию старого свидетельства

  • добавить /a к цепочке параметров. Это приведет к «автоматическому выбору лучшего сертификата подписи» (что бы это ни значило :))

  • вы можете дождаться истечения срока действия старого сертификата. После этого, он должен автоматически использовать только новый сертификат

+0

Спасибо за ответ! Я, однако, придерживаюсь своего обходного пути, потому что: a.) Срок действия сертификата истек, и я не могу легко проверить ваше решение надежно b.) Я уже неоднократно искал все магазины в certmgr и не удалось найти старый сертификат c.) «Обходной путь» кажется мне более ясным, чем добавление еще более «мистических» параметров '/ a';) – Vertigo

0

Моя ситуация выглядит похоже, но в моем случае, поставив пароль для файла сертификата в моем сценарии сборки не вариант. У меня возникла проблема с использованием любой оснастки MMC для просмотра (например, certmgr.msc) для просмотра хранилищ сертификатов, поскольку Windows Server 2012 R2 не позволяла моему пользователю, не являющемуся администратором, использовать оснастки.Я прибег к попытке вариации сценария PowerShell, который я нашел здесь (https://social.technet.microsoft.com/Forums/windowsserver/en-US/7ed48943-22e2-4afd-aa77-2424d2a9eee1/how-to-delete-archived-certificates-using-the-certutil-command?forum=winserversecurity):

$store = New-Object System.Security.Cryptography.X509Certificates.X509Store "My","CurrentUser" 

$MaxAllowedIncludeArchive = ([System.Security.Cryptography.X509Certificates.openflags]::MaxAllowed –bor [System.Security.Cryptography.X509Certificates.openflags]::IncludeArchived) 
$store.Open($MaxAllowedIncludeArchive) 

[System.Security.Cryptography.X509Certificates.X509Certificate2Collection] $certificates = $store.certificates 

foreach ($cert in $certificates) 
{ 
    Write-Host $cert 
} 

$store.Close() 

Он показал мне сертификат, который создавал конфликт для меня. (Как ни странно, попытка использовать certutil -viewstore My предоставила другой набор сертификатов. (Размещение хранилищ сертификатов по-прежнему, к сожалению, сбивает с толку.)

В моем случае проблема заключалась в том, что мне нужен новый сертификат SHA256 вместо моего старого SHA1, поэтому добавление соответствующего аргумента/i моей команде signtool (с именем эмитента SHA256) устранило мою проблему.