Подпись CMS - Какая разница в метке времени и встречной подписи
Я пытаюсь TimeStamp Digital Siganture (с локальным сертификатом TimeStamp) в C# с BouncyCastle. Я понимаю, что TimeStamp состоит в том, чтобы подписать текущее время. Не уверены, должно ли это быть текущее время + оригинальное содержание подписи? Пожалуйста, помогите в этом тоже.
Моя главная путаница заключается в том, что сгенерированный TimeStamp будет добавлен в атрибуты Singed/Unsigned оригинальной подписи. ИЛИ это будет добавлено как контрподпись?
1 ответ
Целью отметки времени является подтверждение того, что подпись была создана до определенного времени, поэтому отметкой времени необходимо подписать цифровую подпись и текущее время. Отметка времени должна быть добавлена в подпись CMS как неподписанный атрибут. К тому же SignatureTimeStampToken - это сама подпись.
Чтобы добавить метку времени в CMS, вы можете использовать атрибут метки времени Signature, который имеет идентификатор объекта 1.2.840.113549.1.9.16.2.14 и имеет тип ASN.1 (вся информация ниже извлечена из RFC CMS и TSP)
SignatureTimeStampToken ::= TimeStampToken
TimeStampToken ::= ContentInfo
-- contentType is id-signedData ([CMS])
-- content is SignedData ([CMS])
SignedData ::= SEQUENCE {
version CMSVersion,
digestAlgorithms DigestAlgorithmIdentifiers,
encapContentInfo EncapsulatedContentInfo,
certificates [0] IMPLICIT CertificateSet OPTIONAL,
crls [1] IMPLICIT RevocationInfoChoices OPTIONAL,
signerInfos SignerInfos }
В TimeStampToken поля типа EncapsulatedContentInfo конструкции SignedData имеют следующие значения:
eContentType - это идентификатор объекта, который однозначно определяет тип содержимого. Для метки времени она определяется как:
id-ct-TSTInfo OBJECT IDENTIFIER ::= { iso(1) member-body(2)
us(840) rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) ct(1) 4}
eContent - это сам контент, передаваемый в виде строки октетов. eContent ДОЛЖЕН быть значением TSTInfo в кодировке DER.
Маркер отметки времени НЕ ДОЛЖЕН содержать никаких подписей, кроме подписи TSA. Идентификатор сертификата (ESSCertID) сертификата TSA ДОЛЖЕН быть включен в качестве атрибута signerInfo в атрибут SigningCertificate.
TSTInfo ::= SEQUENCE {
version INTEGER { v1(1) },
policy TSAPolicyId,
messageImprint MessageImprint,
-- MUST have the same value as the similar field in
-- TimeStampReq
serialNumber INTEGER,
-- Time-Stamping users MUST be ready to accommodate integers
-- up to 160 bits.
genTime GeneralizedTime,
accuracy Accuracy OPTIONAL,
ordering BOOLEAN DEFAULT FALSE,
nonce INTEGER OPTIONAL,
-- MUST be present if the similar field was present
-- in TimeStampReq. In that case it MUST have the same value.
tsa [0] GeneralName OPTIONAL,
extensions [1] IMPLICIT Extensions OPTIONAL }
Надеюсь это поможет,