Существует много сайтов, которые объясняют, как запустить signtool.exe
в файле сертификата .pfx
, который сводится к следующему:
signtool.exe sign /f mycert.pfx /p mypassword /t http://timestamp.server.com \
/d "My description" file1.exe file2.exe
У меня есть непрерывная интеграция процесса CI (с использованием TeamCity), которая, как и большинство процессов CI, выполняет все: проверяет исходный код, компилирует, выписывает все .exe, пакеты в установщик и подписывает установщик .exe. В настоящее время существует 3 агента сборки, которые работают с идентичными виртуальными машинами, и любой из них может запускать этот процесс.
Небезопасная реализация
Чтобы сделать это сегодня, я делаю пару Bad Things (TM) в отношении безопасности: файл .pfx находится в исходном управлении, а пароль для него находится в сборке script (также в исходном управлении). Это означает, что любые разработчики, имеющие доступ к репозиторию исходного кода, могут взять файл pfx и делать любые гнусные вещи, которые им бы хотелось. (Мы - относительно небольшой магазин для разработчиков и доверяем всем, у кого есть доступ, но ясно, что это все еще не хорошо).
Конечная безопасная реализация
Все, что я могу найти о том, чтобы делать это "правильно", заключается в том, что вы:
- Сохраняйте pfx и пароль на каком-либо защищенном носителе (например, зашифрованный USB-накопитель с разблокировкой на основе пальцев) и, возможно, не вместе
- Назначьте только пару людей, чтобы иметь доступ к файлам подписи.
- Подписывать окончательные сборки на не связанной, выделенной машине, которая хранится в заблокированном хранилище, пока вам не нужно будет вывести ее для этой церемонии подписания кода.
В то время как я вижу достоинство в безопасности этого процесса, это очень тяжелый процесс и с точки зрения времени он очень дорог (проходит через этот процесс, надежно сохраняя резервные копии сертификатов, обеспечивая, чтобы машина для подписи кода работала состояние и т.д.).
Я уверен, что некоторые люди пропускают шаги и просто подписывают файлы с сертификатом, хранящимся в их личной системе, но это все еще не очень хорошо.
Он также несовместим с подписями файлов, которые затем используются в установщике (который также создается сервером сборки) - и это важно, когда у вас установлен установленный .exe, у которого есть приглашение UAC для доступа администратора доступ.
Ближний грунт?
Я гораздо больше обеспокоен тем, что вы не представляете страшное "ненадежное приложение" для пользователей UAC, чем доказывать, что это моя компания. В то же время хранение личного ключа и пароля в репозитории исходного кода, который имеет каждый разработчик (плюс QA и высокотехнологичная техническая поддержка), явно не является хорошей практикой безопасности.
Я бы хотел, чтобы сервер CI все еще подписывался во время процесса сборки, как сегодня, но без пароля (или части секретного ключа сертификата) для всех, у кого есть доступ к репозиторию исходного кода.
Есть ли способ как-то защитить пароль от сборки или безопасности? Должен ли я указывать signtool для использования хранилища сертификатов (и как это сделать, с 3 агентами сборки и сборкой, выполняемой как неинтерактивная учетная запись пользователя)? Что-то другое?