Справочные материалы
На этой странице собрана справочная информация, общая для различных способов интеграции сервиса удалённого подписания кода sslTrus, включая:
- Правила подсчёта количества операций подписания кода.
- Протоколы штампов времени Authenticode и RFC 3161.
- Часто используемые серверы штампов времени для подписания кода.
- На что следует обращать внимание при выборе службы штампов времени в производственной среде.
Подсчёт количества операций подписания
Количество операций подписания рассчитывается по фактически выполненным действиям подписания.
Если говорить просто:
一个文件成功完成一次签名 = 一次签名次数
Количество подписей рассчитывается не по числу файлов исходного кода, не по одной сборке, не по одной упаковке и не по одному конвейеру CI/CD.
Например:
100 个源代码文件
↓
编译生成 1 个 app.exe
↓
app.exe 成功签名一次
↓
1 次签名
Если одна сборка приводит к:
app.exe
helper.dll
installer.msi
Если все три файла подписаны по отдельности, то:
签名次数 = 3 次
Основные правила
Количество операций подписи в основном зависит от:
- Какие файлы или объекты были подписаны в итоге.
- Сколько раз фактически была выполнена подпись каждого объекта.
- Использовалась ли обычная клиентская подпись или низкоуровневые способы вызова подписи, такие как KSP, Jarsigner и т. д.
- Подписывал ли инструмент сборки автоматически дополнительные 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.exe | 1 раз |
| Сначала выполнить SHA256, затем добавить SHA1 | 2 раза |
Подписать отдельно app.exe, helper.dll, uninstall.exe | 3 раза |
Поэтому:
SignTool CLI 双签 = 1 次
KSP 双签 = 2 次
Если инструмент выполняет несколько базовых операций подписания для одного и того же файла, каждая успешная удаленная подпись будет учитываться отдельно.
CSP
CSP — это традиционный провайдер Windows CryptoAPI.
CSP аналогично вызывается Microsoft SignTool или другими приложениями Windows через провайдера для вызова службы удаленного подписания.
При определении количества подписаний следует ориентироваться на фактически выполненные операции подписания удаленным закрытым ключом.
Если инструмент подписывает несколько файлов по отдельности или выполняет несколько подписаний для одного и того же файла, они должны учитываться отдельно.
Jarsigner
При использовании провайдера sslTrusJarsigner стандартный jarsigner в процессе подписания обращается к службе удаленного подписания кода.
Обычно:
| Операция | Количество подписаний |
|---|---|
Подписание app.jar | 1 раз |
| Отдельное подписание 3 JAR-файлов | 3 раза |
| Повторное подписание того же JAR-файла | дополнительно 1 раз |
jarsigner -verify | 0 раз |
| Создание keystore для проверки | 0 раз |
Поэтому:
每个 JAR 每次成功完成签名 = 1 次
Установочный пакет
При работе с установочным пакетом необходимо различать:
- Исполняемый файл внутри установочного пакета.
- Сам установочный пакет.
Например:
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.exe | 1 |
ffmpeg.dll | 1 |
update.exe | 1 |
uninstall.exe | 1 |
MyApp Setup.exe | 1 |
| Итого | 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, перед внедрением в эксплуатацию следует провести практическую проверку.
Сравнение серверов меток времени
| Поставщик | Адрес | Authenticode | RFC 3161 |
|---|---|---|---|
| Microsoft | http://timestamp.acs.microsoft.com | Не подтверждено | Поддерживается |
| Sectigo | http://timestamp.sectigo.com | Поддерживается | Поддерживается |
| DigiCert | http://timestamp.digicert.com | Не подтверждено | Поддерживается |
| Certum | http://time.certum.pl | Поддерживается | Поддерживается |
| GlobalSign | http://timestamp.globalsign.com/tsa/r45standard | Не подтверждено | Поддерживается |
| SSL.com | http://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
其他代码签名验证器
По умолчанию все будут доверять цепочке его сертификатов.
В производственной среде для проверки подписанного результата следует использовать фактическую проверку на целевой платформе.
Проверка в производственной среде
Перед добавлением сервера меток времени в производственную конфигурацию рекомендуется как минимум убедиться в следующем:
- Официальные материалы поставщика услуги явно публикуют эту конечную точку.
- Поставщик услуги явно поддерживает требуемый протокол меток времени.
- Используется алгоритм дайджеста метки времени SHA-256 или более стойкий.
- Целевая система может проверить полную цепочку сертификатов TSA.
- DNS, прокси, межсетевой экран и исходящая сеть могут стабильно обращаться к TSA.
- Подтверждены способ аутентификации, ограничения скорости, региональные ограничения и условия обслуживания.
- Проверка подписи выполнена с использованием фактического подписанного результата.
Не полагайтесь только на:
浏览器可以打开
HTTP 返回 200
Определите, подходит ли сервер меток времени для подписи кода.
Обязательно используйте фактический инструмент подписи для отправки запроса метки времени и выполните проверку конечного продукта.
Рекомендации по выбору метки времени
Для современной подписи кода Windows SHA-2 обычно в первую очередь выбирайте службу меток времени с поддержкой RFC 3161.
Например:
Microsoft
Sectigo
DigiCert
Certum
GlobalSign
Окончательный выбор должен учитывать в комплексе:
- Целевую операционную систему.
- Инструмент подписи.
- Цепочку сертификатов TSA.
- Сетевую доступность.
- Региональные ограничения.
- Ограничения по частоте вызовов.
- Условия предоставления услуги.
- Соглашение об уровне обслуживания.
- Результаты проверки фактического продукта подписи.
Если поставщик сертификатов предъявляет явные требования к службе меток времени, следует в первую очередь соблюдать соответствующие политики сертификатов и требования поставщика услуг.
Связанные способы интеграции
В разных способах интеграции используются правила количества подписей и меток времени, описанные на этой странице:
| Сценарий использования | Документация |
|---|---|
| SignTool CLI | Клиентские инструменты |
| Windows KSP / CSP | Windows Provider |
| Jarsigner | Интеграция с Java |
| GitHub Actions, Electron Builder, Advanced Installer | CI/CD и инструменты сборки |
| Прямой вызов интерфейса удалённой подписи | Интеграция с API |