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.
❓ Какой максимальный размер данных для хэширования?
Хэш рассчитывается клиентом заранее, поэтому ограничений на размер исходных данных нет.