8.4 時間戳申請和響應消息格式
8.4.1 申請消息格式
時間戳服務申請消息格式如下:
TimeStampReq ::= SEQUENCE {
version INTEGER { v1(1) },
messageImprint MessageImprint,
reqPolicy TSAPolicyId OPTIONAL,
nonce INTEGER OPTIONAL,
certReq BOOLEAN DEFAULT FALSE,
extensions [0] IMPLICIT Extensions OPTIONAL }
對于各項的具體解釋如下:
a)版本(version)域表示時間戳申請消息格式的版本號,依據本標準寫成的申請消息版本為1;
b)messageImprint域應該包含需要加蓋時間戳的數據的Hash值。該Hash值的類型是Octet String,它的長度應是相應Hash算法的結果長度(例如:SHA-1算法結果是160位,MD5算法結果是128字節)。具體格式:
MessageImprint ::= SEQUENCE {
hashAlgorithm AlgorithmIdentifier,
hashedMessage OCTET STRING }
在hashAlgorithm域中表示的Hash算法應該是一個已知的Hash算法(一個單向函數)。TSA應該檢查給出的Hash算法是否符合國家密碼管理部門的相關規定。如果TSA不認識給出的Hash算法或這個Hash算法不符合國家密碼管理部門的相關規定,那么TSA應該拒絕提供時間戳服務,并在返回消息中設置‘bad_ald’的pkiStatusInfo結構;
c)如果用戶需要指明時間戳應該在什么樣的安全策略下生成,用戶可以設置reqPolicy域說明需要的安全策略;
d)如果請求消息中有nonce域,它是為了在沒有可靠的本地時鐘的情況下檢驗響應消息的合法性并防止重放攻擊。nonce是一個很大的隨機數,而且以很高的概率不被重復(例如:一個64比特的整數)。在這種情況下,nonce應被包含在響應消息中,否則響應消息應該被拒絕接受;
e)如果請求消息中有certReq域且被設為true,則TSA應在其響應消息中給出它的公鑰證書,該證書由響應消息中SigningCertificate屬性的ESSCertID指出,證書本身則存放在響應消息中SighedData結構的Certificates域。這個域也可以包含其他證書。如果請求消息中沒給出certReq域或者certReq域被設為false,則響應消息中就不必要給出上述證書;
f)擴展(Extensions)域是未來給申請消息添加額外信息的一種方法。擴展都在GB/T BBB—200×中定義。對于一個擴展,無論它是否是關鍵擴展,只要它在請求消息中出現,且又無法被TSA識別,則TSA應該不生成時間戳且返回一個失敗信息(unacceptedExtension)。
時間戳請求消息不需要給出請求方的身份標識,因為TSA并不驗證這個信息(見8.1條)。如果在某些情況下TSA需要驗證請求方的身份,那么就應進行雙向的身份驗證。
8.4.2 響應消息格式
TSA在收到申請消息后,無論申請成功還是失敗,都要給請求方發回一個響應消息。該響應消息或者是正確的時間戳,或者是包含了失敗信息的時間戳。時間戳響應消息的具體格式如下:
TimeStampResp ::= SEQUENCE {
status PKIStatusInfo,
timeStampToken TimeStampToken OPTIONAL }
響應消息中的status具體定義如下:
PKIStatusInfo ::= SEQUENCE {
status PKIStatus,
statusString PKIFreeText OPTIONAL,
failInfo PKIFailureInfo OPTIONAL }
其中PKIStauts有如下定義:
PKIStatus ::= INTEGER {
granted (0),
grantedWithMods (1),
rejection (2),
waiting (3),
revocationWarning (4),
revocationNotification (5) }
如果PKIStatusInfo中的status值為0或者1時,響應消息中的TimeStampToken 就應出現,否則 TimeStampToken就不能出現。
status不能有除PKIStatus外的其他值,如果請求方收到一個不認識的值,查看時間戳時應該報告錯誤。
PKIFailureInfo ::= BIT STRING {
badAlg (0), --申請使用了不支持的算法
badRequest (2), --非法的申請
badDataFormat (5), --數據格式錯誤
timeNotAvailable (14), --TSA的可信時間源出現問題
unacceptedPolicy (15), --不支持申請消息中聲明的策略
unacceptedExtension (16), --申請消息中包括了不支持的擴展
addInfoNotAvailable (17), --有不理解或不可用的附加信息
systemFailure (25) --系統內部錯誤 }
failInfo不能有除PKIFailureInfo外的其他值,如果請求方收到一個不認識的值,查看時間戳時應該報告錯誤。
TimeStampToken ::= ContentInfo
-- contentType is id-signedData (RFC2630)
-- content is SignedData (RFC2630)
在ContentInfo定義的SignedData結構中,EncapsulatedContentInfo 類中的域有如下意思:
a)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};
b)eContent就是時間戳內容本身,它是一個octet string。內容應該是下面說明的TSTInfo的DER編碼。
TimeStampToken一定不能含有除TSA簽名以外的任何簽名。而TSA證書的證書標識符(ESSCertID)應作為SignerInfo的屬性包含在SigningCertficate 屬性里。
TSTInfo ::= SEQUENCE {
version INTEGER { v1(1) },
policy TSAPolicyId,
messageImprint MessageImprint,
serialNumber INTEGER,
genTime GeneralizedTime,
accuracy Accuracy OPTIONAL,
ordering BOOLEAN DEFAULT FALSE,
nonce INTEGER OPTIONAL,
tsa [0] GeneralName OPTIONAL,
extensions [1] IMPLICIT Extensions OPTIONAL }
對于TSTInfo的具體各項解釋如下:
a)version域說明了時間戳的版本號,依據本標準寫成的時間戳版本號為1;
b)policy域應指明響應消息是根據TSA的哪個策略生成的。如果類似的域出現在TimeStampReq中,這里應有相同的值,否則應返回錯誤(unacceptedPolicy)。這個policy可以包含下列類型的信息(但下列并不全面):
——這個時間戳在什么條件下使用;
——時間戳日志的有效性,以便以后能夠證實時間戳是可信的。
c)messageImprint應同TimeStampReq中類似的域有相同的值,前提是Hash值的長度與hashAlgorithm標記的算法預期的長度相同;
d)serialNumber域是TSA分配給每個時間戳的一個整數。對一個給定的TSA發出的每一個時間戳它都應是唯一的(即TSA的名字和序列號可以確定一個時間戳標志)。應該注意的是,即使經歷一個可能的服務中斷(例如崩潰)后,這個特性也應保留;
e)genTime 是TSA創建時間戳的時間。用UTC時間表示,以減少使用本地時區用法造成的混亂。時間的具體格式應遵守8.3條的規定;
Accuracy ::= SEQUENCE {
seconds INTEGER OPTIONAL,--s
millis INTEGER (1..999) OPTIONAL,--ms
micros [1] INTEGER (1..999) OPTIONAL – us }
如果seconds、 millis 或者 micros 沒出現,則不出現的這些域的值應被賦為0。
當accuracy這個可選項不出現時,精確度可以從別的途徑得到,例如TSAPolicyId;
g)ordering表示時間戳排序條件。如果ordering域不出現,或者ordering域出現但被置為false,那么genTime域只表示TSA創建時間戳的時間。在這種情況下,只有兩個時間戳中第一個的genTime與第二個的genTime之差大于這兩個genTime的精確度的和,同一個TSA或者不同的TSA簽發的時間戳標志才有可能排序。如果ordering域出現并被置為true,同一個TSA發的每一個時間戳都可以依據genTime排序,而不必考慮genTime 精確度;
h)nonce域如果在TimeStampReq中出現,在這里也應出現,值也應等于TimeStampReq中的值;
i)tsa域的目的是為鑒別TSA的名字提供一個線索。如果出現,應與驗證時間戳的證書里的subject names中的一個相同;
j)擴展(extensions)域是為將來增加額外的信息而采用的一種通常的做法。由GB/T BBB—200×定義。特殊的擴展類型可以由組織或者團體自行定義并聲明注冊。
推薦文章: