TSP
1. Общие сведения
1.1 Описание
TSP (Time Stamping Protocol) — протокол, используемый для получения доверенной метки времени в соответствии с RFC 3161. Метка времени позволяет подтвердить существование определённого документа или подписи на момент выдачи метки.
ООО "КРИПТО-ПРО" предоставляет сервис доверительного времени (TSP), доступный по следующему URL:
http://qs.cryptopro.ru/tsp/tsp.srf
Сервис может быть использован как часть процесса формирования электронной подписи (например, при создании CMS-подписей или CAdES).
2. Поддерживаемые стандарты и протоколы
2.1 Протоколы
- RFC 3161 — Internet X.509 Public Key Infrastructure Time-Stamp Protocol (TSP)
- PKIX — Public Key Infrastructure X.509
2.2 Алгоритмы хэширования
Поддерживаемые алгоритмы хэширования:
- GOST R 34.11-2012 (256 бит и 512 бит)
- SHA-1, SHA-256, SHA-384, SHA-512
⚠️ SHA-1 не рекомендуется использовать из-за уязвимостей.
3. Формат запроса
Запрос к TSP-сервису представляет собой DER-кодированный объект типа TSTInfo, обёрнутый в PKCS#7 / CMS структуру согласно RFC 3161.
3.1 Структура запроса
TimeStampReq ::= SEQUENCE {
version INTEGER { v1(1) },
messageImprint MessageImprint,
reqPolicy OBJECT IDENTIFIER OPTIONAL,
nonce INTEGER OPTIONAL,
certReq BOOLEAN DEFAULT FALSE,
extensions [0] IMPLICIT Extensions OPTIONAL
}
Где:
- messageImprint — хэш данных, для которых запрашивается метка времени.
- reqPolicy — идентификатор политики (OID), если требуется специальная политика метки времени.
- nonce — случайное число, которое будет включено в ответ для предотвращения повторных атак.
- certReq — флаг, указывающий, требуется ли сертификат TSA в ответе.
- extensions — дополнительные параметры.
4. Формат ответа
Ответ от сервера также соответствует RFC 3161 и представляет собой DER-кодированный объект TimeStampResp.
4.1 Структура ответа
TimeStampResp ::= SEQUENCE {
status PKIStatusInfo,
timeStampToken TimeStampToken OPTIONAL
}
status— содержит код состояния операции (granted,rejected,waiting, и др.)timeStampToken— токен метки времени, содержащий подписанную структуруTSTInfo.
Пример содержимого TSTInfo:
TSTInfo ::= SEQUENCE {
version INTEGER { v1(1) },
policy OBJECT IDENTIFIER,
messageImprint MessageImprint,
serialNumber INTEGER,
genTime GeneralizedTime,
accuracy Accuracy OPTIONAL,
ordering BOOLEAN DEFAULT FALSE,
nonce INTEGER OPTIONAL,
tspName GeneralName OPTIONAL,
extensions [0] EXPLICIT Extensions OPTIONAL
}
5. Работа с сервисом
5.1 Получение метки времени через командную строку (OpenSSL)
Если используется OpenSSL, можно получить метку времени следующим образом:
Шаг 1: Создать хэш файла
openssl dgst -sha256 -binary file.txt > file.sha256
Шаг 2: Отправить запрос на TSP-сервер
openssl ts -query -data file.sha256 -sha256 -no_nonce -out request.tsq
Шаг 3: Отправить запрос на сервер с помощью curl
curl -H "Content-Type: application/timestamp-query" \
--data-binary @request.tsq \
http://qs.cryptopro.ru/tsp/tsp.srf > response.tsr
Шаг 4: Проверить ответ
openssl ts -reply -in response.tsr -text
5.2 Использование через CryptoPro CSP
Если вы работаете в среде Windows с установленным CryptoPro CSP, можно использовать утилиту cryptcp.
Пример:
cryptcp -ts http://qs.cryptopro.ru/tsp/tsp.srf -in file.sig -out timestamped.sig
Также можно добавлять метку времени к подписи при помощи CryptoAPI или CAPICOM.
6. Сертификаты
Сертификат TSP-сервера выдан УЦ ООО "КРИПТО-ПРО". Для проверки подписи метки времени необходимо иметь корневой или промежуточный сертификат УЦ.
7. Требования к клиентам
- Поддержка протокола HTTP/1.1
- Возможность отправлять и принимать данные в формате DER
- Корректно сформированный запрос в формате RFC 3161
- Наличие актуальных корневых сертификатов для проверки ответа
8. Ошибки и коды ответов
| Код | Описание |
|---|---|
| 0 | granted — запрос успешно выполнен |
| 1 | grantedWithMods — выполнено с модификациями |
| 2 | rejection — запрос отклонён |
| 3 | waiting — запрос принят, ожидает обработки |
| 4 | revocationWarning — есть предупреждение о отзыве |
| 5 | revocationNotification — уведомление об отзыве |
| 6 | signingCertificateMissing — нет необходимого сертификата |
| 7 | timeNotAvailable — время недоступно |
9. Часто задаваемые вопросы
❓ Как проверить метку времени?
Используйте openssl ts -verify или аналогичные средства проверки подписи в вашем приложении.
❓ Можно ли использовать GOST-хэши?
Да, начиная с версий OpenSSL 1.1.1 и выше, поддерживается GOST R 34.11-2012.
❓ Какой максимальный размер данных для хэширования?
Хэш рассчитывается клиентом заранее, поэтому ограничений на размер исходных данных нет.