CMS签名 – 时间戳和计数器签名有什么区别

我正在尝试使用BouncyCastle在C#中使用TimeStamp数字Siganture(使用本地TimeStamp证书)。 我对TimeStamp的理解是它要签署当前时间。 不确定它是否应该是当前时间+原始签名内容? 请帮忙。

我的主要困惑是如果将生成的TimeStamp添加到原始签名的Singed / Unsigned属性中。 或者它会被添加为CounterSignature?

时间戳的目标是certificate签名是在给定时间之前创建的,因此使用时间戳您必须签署数字签名和当前时间。 必须将时间戳添加到CMS签名作为无符号属性。 除了SignatureTimeStampToken本身就是签名。

要向CMS添加时间戳,您可以使用签名时间戳属性,该属性具有1.2.840.113549.1.9.16.2.14对象标识符并具有ASN.1类型(以下信息全部从CMS和TSP RFC中提取)

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中,SignedData构造的EncapsulatedContentInfo类型的字段具有以下含义:

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是内容本身,以八位字符串forms携带.eContent应为TSTInfo的DER编码值。

时间戳令牌不得包含除TSA签名以外的任何签名。 TSA证书的证书标识符(ESSCertID)必须作为SigningCertificate属性内的signerInfo属性包含在内。

  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 } 

希望这可以帮助,