Справочные материалы
На этой странице собрана справочная информация, общая для различных способов интеграции сервиса удалённого подписания кода 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 Provider.
CSP также вызывается Microsoft SignTool или другими Windows-приложениями через Provider для обращения к службе удалённой подписи.
При определении количества подписей следует ориентироваться на фактически выполненные операции удалённой подписи закрытым ключом.
Если инструмент подписывает несколько файлов по отдельности или выполняет несколько подписей для одного и того же файла, они учитываются отдельно.
Jarsigner
При использовании Provider 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 |