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

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

На этой странице собрана справочная информация, общая для различных способов интеграции сервиса удалённого подписания кода 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 Provider.

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

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

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

Jarsigner​

При использовании Provider 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