Перейти к основному содержимому

Справочные материалы

На этой странице собрана справочная информация, общая для различных способов интеграции сервиса удалённого подписания кода sslTrus, включая:

  • Правила подсчёта количества операций подписания кода.
  • Протоколы штампов времени Authenticode и RFC 3161.
  • Часто используемые серверы штампов времени для подписания кода.
  • На что следует обращать внимание при выборе службы штампов времени в производственной среде.

Подсчёт количества операций подписания

Количество операций подписания рассчитывается по фактически выполненным действиям подписания.

Если говорить просто:

一个文件成功完成一次签名 = 一次签名次数

Количество подписей рассчитывается не по числу файлов исходного кода, не по одной сборке, не по одной упаковке и не по одному конвейеру CI/CD.

Например:

100 个源代码文件

编译生成 1 个 app.exe

app.exe 成功签名一次

1 次签名

Если одна сборка приводит к:

app.exe
helper.dll
installer.msi

Если все три файла подписаны по отдельности, то:

签名次数 = 3 次

Основные правила

Количество операций подписи в основном зависит от:

  1. Какие файлы или объекты были подписаны в итоге.
  2. Сколько раз фактически была выполнена подпись каждого объекта.
  3. Использовалась ли обычная клиентская подпись или низкоуровневые способы вызова подписи, такие как KSP, Jarsigner и т. д.
  4. Подписывал ли инструмент сборки автоматически дополнительные EXE, DLL, программы удаления или установочные пакеты.

К часто подписываемым объектам относятся:

  • .exe
  • .dll
  • .msi
  • .msp
  • .sys
  • .cat
  • .jar
  • Программа удаления, например uninstall.exe

Если какой-либо объект фактически успешно завершил одну операцию подписи, она учитывается по соответствующему правилу подсчёта.

Подсчёт только при успешном выполнении

Количество операций подписи учитывается только тогда, когда служба удалённой подписи кода успешно завершила подпись.

Следующие случаи обычно не учитываются:

  • Ошибка аутентификации.
  • Ошибка параметров.
  • Недоступность сертификата.
  • Сбой сетевого запроса.
  • Сервер не вернул успешный результат подписи.
  • Запрос сертификата.
  • Запрос записей о подписи.
  • Проверка подписи.
  • Удаление существующей подписи.
  • Создание файла проверки.

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

Метка времени не учитывается отдельно

Метка времени используется для подтверждения того, что подпись уже существовала в определённый момент, и не является новой операцией подписи кода.

Поэтому:

Подписание кода       → Учитывается как подписание
Добавление метки времени → Не учитывается дополнительно
Проверка подписи → Не учитывается

Зависит ли успех службы отметок времени только от результата отметки времени в итоговом подписанном файле и не означает ли это, что код был подписан дополнительно.

SignTool CLI

Использование sslTrus SignTool CLI:

signtool sign \
--cert-code CERT_CODE \
--file app.exe

Если подпись успешна:

1 个文件 × 1 次成功签名 = 1 次

Например:

signtool sign --cert-code CERT_CODE --file app.exe
signtool sign --cert-code CERT_CODE --file helper.dll
signtool sign --cert-code CERT_CODE --file installer.msi

Все три файла успешно:

合计 = 3 次

SignTool CLI двойная подпись

Если используется обычный SignTool CLI с одновременным включением SHA-1 и SHA-2:

signtool sign \
--cert-code CERT_CODE \
--file app.exe \
--sha1=true \
--sha2=true

Обычная двойная подпись CLI рассчитывается как одна задача подписания на клиенте:

GUI / SignTool CLI 双签 = 1 次

Это место легче всего перепутать между обычным клиентским процессом подписи и базовым вызовом подписи KSP.

Windows KSP

KSP — это способ интеграции Windows CNG Provider.

Когда Microsoft SignTool, MSBuild, Visual Studio, инструменты упаковки Electron или другое программное обеспечение Windows вызывает удалённое подписание кода через KSP, подсчёт операций ближе к:

底层远程私钥签名调用次数

Например:

ОперацияКоличество подписей
Выполнить однократную подпись SHA256 для app.exe1 раз
Сначала выполнить SHA256, затем добавить SHA12 раза
Подписать отдельно app.exe, helper.dll, uninstall.exe3 раза

Поэтому:

SignTool CLI 双签 = 1 次
KSP 双签 = 2 次

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

CSP

CSP — это традиционный провайдер Windows CryptoAPI.

CSP аналогично вызывается Microsoft SignTool или другими приложениями Windows через провайдера для вызова службы удаленного подписания.

При определении количества подписаний следует ориентироваться на фактически выполненные операции подписания удаленным закрытым ключом.

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

Jarsigner

При использовании провайдера sslTrusJarsigner стандартный jarsigner в процессе подписания обращается к службе удаленного подписания кода.

Обычно:

ОперацияКоличество подписаний
Подписание app.jar1 раз
Отдельное подписание 3 JAR-файлов3 раза
Повторное подписание того же JAR-файладополнительно 1 раз
jarsigner -verify0 раз
Создание keystore для проверки0 раз

Поэтому:

每个 JAR 每次成功完成签名 = 1 次

Установочный пакет

При работе с установочным пакетом необходимо различать:

  1. Исполняемый файл внутри установочного пакета.
  2. Сам установочный пакет.

Например:

app.exe       → подпись 1 раз
installer.msi → подпись 1 раз

то:

合计 = 2 次

Если есть и другие файлы:

ФайлПодписанКоличество подписей
app.exeДа1
helper.dllДа1
driver.sysДа1
installer.msiДа1
Итого4

Сколько исходного кода, файлов ресурсов, изображений или файлов конфигурации содержится в установочном пакете, напрямую не влияет на количество подписей.

Ключевой момент:

最终到底有哪些产物被实际签名

Electron

Инструменты сборки настольных приложений, такие как Electron Builder и Electron Forge, могут автоматически подписывать несколько файлов за один процесс упаковки.

К часто встречающимся объектам относятся:

  • Основная программа .exe
  • DLL
  • Программа обновления
  • Программа удаления
  • Установочный пакет .exe
  • MSI
  • Другие вспомогательные исполняемые файлы

Например:

РезультатКоличество подписей
MyApp.exe1
ffmpeg.dll1
update.exe1
uninstall.exe1
MyApp Setup.exe1
Итого5

Поэтому:

一次 Electron Build ≠ 一次签名

Следует рассчитывать исходя из фактического количества подписываемых артефактов и количества операций подписи для каждого артефакта.

Если Electron использует KSP и выполняет двойную подпись одного и того же файла, для этого файла также может быть выполнено два удалённых подписания.

Быстрая оценка

Если неизвестно, сколько операций подписи будет выполнено за одну сборку, можно последовательно проверить:

1. 最终有哪些文件被签名?
2. 每个文件签了几次?
3. 使用的是 SignTool CLI 还是 KSP / Jarsigner?
4. 构建工具有没有自动签额外文件?

Можно просто понять это так:

签名次数 = 成功完成的签名动作数量之和

Особое внимание:

GUI / SignTool CLI 双签                = 1 次
KSP 对同一个文件执行两次底层签名 = 2 次
Jarsigner 每个 JAR 每次成功签名 = 1 次
时间戳 = 0 次
验证签名 = 0 次

Сервер меток времени

При подписании кода обычно одновременно используется служба меток времени.

Метка времени подтверждает, что цифровая подпись уже существовала в определённый момент времени, что позволяет проверяющей стороне судить о действительности подписи с учётом сертификата подписи, сертификата метки времени, статуса отзыва и политики проверки.

Для подписания кода чаще всего используются два протокола меток времени:

ПротоколОписание
AuthenticodeТрадиционный протокол меток времени Microsoft, в основном используется для совместимости со старыми сценариями подписания кода Windows
RFC 3161Универсальный протокол меток времени, подходит для современных сценариев подписания кода

В современных сценариях подписания кода обычно предпочтителен RFC 3161.

RFC 3161

Запрос метки времени по RFC 3161 отправляет дайджест данных, для которых запрашивается метка времени, а не исходный файл.

Основной процесс:

代码签名

计算待时间戳数据摘要

发送摘要到 TSA

TSA 返回时间戳令牌

写入最终签名

Маркер временной метки обычно содержит:

  • Дайджест данных.
  • Время выдачи временной метки.
  • Политику TSA.
  • Цифровую подпись TSA.

Сервер временных меток не расходует дополнительное количество операций подписи кода sslTrus при добавлении временной метки.

Распространённые серверы временных меток

Следующие конечные точки подходят для распространённых сценариев подписи кода.

Перед использованием в рабочей среде следует заново проверить актуальную официальную документацию, политику обслуживания и доступность соответствующего поставщика.

Microsoft

http://timestamp.acs.microsoft.com

В основном используется для меток времени RFC 3161.

Подходит в качестве кандидата метки времени для сценариев современной подписи кода Windows.

Пример:

--timestamp-rfc3161=http://timestamp.acs.microsoft.com

Microsoft SignTool:

/tr http://timestamp.acs.microsoft.com
/td SHA256

Sectigo

http://timestamp.sectigo.com

Поддержка:

  • Authenticode
  • RFC 3161

Можно использовать в Windows и других инструментах подписи кода, поддерживающих соответствующие протоколы.

Sectigo предъявляет требования к использованию на стороне сервиса при массовых вызовах, поэтому производственные системы должны контролировать частоту вызовов в соответствии с их текущей официальной политикой.

DigiCert

http://timestamp.digicert.com

Поддерживает RFC 3161, может использоваться в сценариях подписи кода, таких как Microsoft Authenticode.

Certum

http://time.certum.pl

Поддерживает:

  • Authenticode
  • RFC 3161

Официальные материалы Certum по подписи кода охватывают сценарии подписи Windows и Java JAR.

GlobalSign

http://timestamp.globalsign.com/tsa/r45standard

В настоящее время материалы для подписи кода GlobalSign используют этот адрес службы меток времени RFC 3161.

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

SSL.com

http://ts.ssl.com

Поддерживается RFC 3161, традиционный протокол Authenticode для меток времени не поддерживается.

Если целевое средство подписи или устаревшая система имеет ограничения совместимости с алгоритмом ключа, используемым TSA, перед внедрением в эксплуатацию следует провести практическую проверку.

Сравнение серверов меток времени

ПоставщикАдресAuthenticodeRFC 3161
Microsofthttp://timestamp.acs.microsoft.comНе подтвержденоПоддерживается
Sectigohttp://timestamp.sectigo.comПоддерживаетсяПоддерживается
DigiCerthttp://timestamp.digicert.comНе подтвержденоПоддерживается
Certumhttp://time.certum.plПоддерживаетсяПоддерживается
GlobalSignhttp://timestamp.globalsign.com/tsa/r45standardНе подтвержденоПоддерживается
SSL.comhttp://ts.ssl.comНе поддерживаетсяПоддерживается

«Поддерживается» в таблице означает возможность протокола, подтверждённую в открытых материалах соответствующего поставщика.

Политика службы меток времени может меняться, поэтому перед настройкой в эксплуатационной среде следует заново свериться с актуальными официальными материалами поставщика.

Службы меток времени с ограничениями

Некоторые серверы меток времени хотя и предоставляют службу RFC 3161, но не могут использоваться напрямую как анонимные публичные TSA.

QuoVadis

Публичные адреса RFC 3161 включают:

http://ts.quovadisglobal.com/eu
http://ts.quovadisglobal.com/ch

Данная служба требует предварительной регистрации исходящих IP-адресов вызывающей стороны, поэтому перед подключением необходимо пройти соответствующую авторизацию.

Apple

http://timestamp.apple.com/ts01

Относится к службе отметок времени, используемой в экосистеме подписи кода Apple.

Её не следует напрямую использовать в качестве универсального сервера отметок времени для Windows Authenticode.

Тестовые службы отметок времени

Некоторые публичные службы RFC 3161 больше подходят для тестирования протокола, а не для непосредственного использования в качестве TSA для подписи производственного кода.

Например:

https://freetsa.org/tsr

Такие службы могут использовать собственные сертификаты CA и TSA.

Поэтому нельзя предполагать:

Windows
macOS
Java
其他代码签名验证器

По умолчанию все будут доверять цепочке его сертификатов.

В производственной среде для проверки подписанного результата следует использовать фактическую проверку на целевой платформе.

Проверка в производственной среде

Перед добавлением сервера меток времени в производственную конфигурацию рекомендуется как минимум убедиться в следующем:

  1. Официальные материалы поставщика услуги явно публикуют эту конечную точку.
  2. Поставщик услуги явно поддерживает требуемый протокол меток времени.
  3. Используется алгоритм дайджеста метки времени SHA-256 или более стойкий.
  4. Целевая система может проверить полную цепочку сертификатов TSA.
  5. DNS, прокси, межсетевой экран и исходящая сеть могут стабильно обращаться к TSA.
  6. Подтверждены способ аутентификации, ограничения скорости, региональные ограничения и условия обслуживания.
  7. Проверка подписи выполнена с использованием фактического подписанного результата.

Не полагайтесь только на:

浏览器可以打开
HTTP 返回 200

Определите, подходит ли сервер меток времени для подписи кода.

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

Рекомендации по выбору метки времени

Для современной подписи кода Windows SHA-2 обычно в первую очередь выбирайте службу меток времени с поддержкой RFC 3161.

Например:

Microsoft
Sectigo
DigiCert
Certum
GlobalSign

Окончательный выбор должен учитывать в комплексе:

  • Целевую операционную систему.
  • Инструмент подписи.
  • Цепочку сертификатов TSA.
  • Сетевую доступность.
  • Региональные ограничения.
  • Ограничения по частоте вызовов.
  • Условия предоставления услуги.
  • Соглашение об уровне обслуживания.
  • Результаты проверки фактического продукта подписи.

Если поставщик сертификатов предъявляет явные требования к службе меток времени, следует в первую очередь соблюдать соответствующие политики сертификатов и требования поставщика услуг.

Связанные способы интеграции

В разных способах интеграции используются правила количества подписей и меток времени, описанные на этой странице:

Сценарий использованияДокументация
SignTool CLIКлиентские инструменты
Windows KSP / CSPWindows Provider
JarsignerИнтеграция с Java
GitHub Actions, Electron Builder, Advanced InstallerCI/CD и инструменты сборки
Прямой вызов интерфейса удалённой подписиИнтеграция с API