6.3 簽名策略要求
對于簽名策略,本標準要求:
a) 簽名者和驗證者應按照簽名策略屬性中給出的簽名策略來產生和驗證簽名;
b) 顯式給出的簽名策略應使用對象表述符標識;
c) 應有一個對應簽名策略的策略說明;
d) 對一個顯式給出的策略,應有一個確定的策略說明格式,并且該格式有唯一的二進制編碼;
e) 對于確定的并且顯式給出的簽名策略說明,應有一個使用合法算法做的雜湊運算結果,簽名者應向驗證者提供該雜湊運算結果,驗證者應檢查該結果的正確性。
簽名策略說明主要包括關于該策略的一般性信息,驗證該策略的規則以及其他的簽名策略相關信息。
6.3.1 ASN.1總體結構
本標準給出的ASN.1語法結構使用DER編碼格式。
簽名策略的ASN.1語法結構描述如下:
SignaturePolicy ::= SEQUENCE {
signPolicyHashAlg AlgorithmIdentifier,
signPolicyInfo SignPolicyInfo,
signPolicyHash SignPolicyHash OPTIONAL }
SignPolicyHash ::= OCTET STRING
SignPolicyInfo ::= SEQUENCE {
signPolicyIdentifier SignPolicyId,
dateOfIssue GeneralizedTime,
policyIssuerName PolicyIssuerName,
fieldOfApplication FieldOfApplication,
signatureValidationPolicy SignatureValidationPolicy,
signPolExtensions SignPolExtensions OPTIONAL}
SignPolicyId ::= OBJECT IDENTIFIER;
PolicyIssuerName字段使用General Name的方式標識策略頒發者,ASN.1定義如下:
PolicyIssuerName ::= GeneralNames;
fieldofApplication字段描述該策略的期望應用領域,ASN.1定義如下:
FieldOfApplication ::= DirectoryString;
6.3.2 簽名驗證策略
對于簽名者,簽名驗證策略(Signature Validation Policy)規定了電子簽名中應包含的數據單元;對于簽名驗證者,簽名驗證策略規定了根據簽名策略的要求,電子簽名中應含有哪些數據單元才有可能驗證通過。
簽名驗證策略的語法結構定義如下:
SignatureValidationPolicy ::= SEQUENCE {
signingPeriod SigningPeriod,
commonRules CommonRules,
commitmentRules CommitmentRules,
signPolExtensions SignPolExtensions OPTIONAL}
其中signingPeriod字段用于給出該簽名策略有效期的起始日期和時間,另外該字段還有一個可選項用于給出該簽名策略有效期的終止日期和時間。該字段的語法結構如下:
SigningPeriod ::= SEQUENCE {
notBefore GeneralizedTime,
notAfter GeneralizedTime OPTIONAL }
6.3.3 通用規則
通用規則(Common Rules)是對所有的承諾類型(commitment types)都適用的規則。其ASN.1語法結構定義如下:
CommonRules ::= SEQUENCE {
signerAndVeriferRules [0] SignerAndVerifierRules OPTIONAL,
signingCertTrustCondition [1] SigningCertTrustCondition OPTIONAL,
timeStampTrustCondition [2] TimestampTrustCondition OPTIONAL,
attributeTrustCondition [3] AttributeTrustCondition OPTIONAL,
algorithmConstraintSet [4] AlgorithmConstraintSet OPTIONAL,
signPolExtensions [5] SignPolExtensions OPTIONAL}
如果某個字段在CommonRules中出現,則相應的字段也應在CommitmentRules中出現。如果下列的某個字段在CommonRules中沒有出現,則在每個CommitmentRule中都應給出:
a) signerAndVerifierRules;
b) signingCertTrustCondition;
c) timeStampTrustCondition。
6.3.4 承諾規則
承諾規則(Commitment Rules)中包含了對給定承諾類型的驗證規則,其ASN.1定義如下:
CommitmentRules ::= SEQUENCE OF CommitmentRule
CommitmentRule的定義如下:
CommitmentRule ::= SEQUENCE {
selCommitmentTypes SelectedCommitmentTypes,
signerAndVeriferRules [0] SignerAndVerifierRules OPTIONAL,
signingCertTrustCondition [1] SigningCertTrustCondition OPTIONAL,
timeStampTrustCondition [2] TimestampTrustCondition OPTIONAL,
attributeTrustCondition [3] AttributeTrustCondition OPTIONAL,
algorithmConstraintSet [4] AlgorithmConstraintSet OPTIONAL,
signPolExtensions [5] SignPolExtensions OPTIONAL}
SelectedCommitmentTypes ::= SEQUENCE OF CHOICE {
empty NULL,
recognizedCommitmentType CommitmentType }
如果SelectedCommitmentTypes中選擇的是empty,則該規則適用于沒有指定承諾類型的情況(即承諾類型通過消息的語義內容指定)。否則,即SelectedCommitmentTypes選擇的是recognizedCommitmentType,則該規則適用于recognizedCommitmentType給出的某個承諾類型。一種承諾類型應至多有一個承諾規則。承諾類型的ASN.1語法結構定義如下:
CommitmentType ::= SEQUENCE {
identifier CommitmentTypeIdentifier,
fieldOfApplication [0] FieldOfApplication OPTIONAL,
semantics [1] DirectoryString OPTIONAL }
其中fieldOfApplication字段 和semantics字段定義了該承諾類型在簽名策略規定的總的應用領域中的具體用法和含義。
6.3.5 簽名者和驗證者規則
6.3.5.1 導引
簽名者和驗證者規則(Singer and Verifier Rules)包含了一個簽名者規則和一個驗證規則,其ASN.1語法結構定義如下:
SignerAndVerifierRules ::= SEQUENCE {
signerRules SignerRules,
verifierRules VerifierRules }
6.3.5.2 簽名者規則
簽名者規則用于標識:
1) eContent字段是否為空,以及簽名值是否是對CMS結構以外的數據的雜湊值做的簽名結果;
2) 根據該簽名策略簽名者應提供的CMS被簽名屬性;
3) 根據該簽名策略簽名者應提供的CMS未被簽名屬性;
4) 在SigningCertificate屬性中,是否需要包含從認證路徑到信任錨點(trust point)的所有證書的標識符;
5) 在SignedData的certificates字段中,是僅需要包含簽名者的證書還是需要從認證路徑到信任錨點的所有證書。
簽名者規則的ASN.1語法結構定義如下:
SignerRules ::= SEQUENCE {
externalSignedData BOOLEAN OPTIONAL,
–如果被簽名數據是CMS結構以外的,則為真
–如果被簽名數據是CMS結構中的一部分則為假
–如果兩者都允許則該字段不出現
mandatedSignedAttr CMSAttrs,
mandatedUnsignedAttr CMSAttrs,
mandatedCertificateRef [0] CertRefReq DEFAULT signerOnly,
mandatedCertificateInfo [1] CertInfoReq DEFAULT none,
signPolExtensions [2] SignPolExtensions OPTIONAL}
CMSAttrs ::= SEQUENCE OF OBJECT IDENTIFIER
其中,mandatedSignedAttr字段需要包括所有本標準中規定的以及該策略規定的被簽名屬性的對象標識符。mandatedUnsignedAttr字段則應包括所有本標準中規定的以及該策略規定的未被簽名屬性的對象標識符。
mandatedCertificateRef用于說明是簽名者僅需要提供簽名者的證書還是需要提供證書路徑上的所有證書。其ASN.1語法結構定義如下:
CertRefReq ::= ENUMERATED {
signerOnly (1), –僅需要提供簽名者證書
fullPath (2)} –要求整個證書路徑上所有證書
mandatedCertificateInfo字段用于說明在SignedData的certificates字段中,是僅需要包含簽名者的證書還是需要從認證路徑到信任錨點的所有證書是簽名者的證書。其ASN.1語法結構定義如下:
CertInfoReq ::= ENUMERATED {
none (0) , –沒有強制要求
signerOnly (1) , –僅要求簽名者證書
fullPath (2)} –要求證書路徑上的所有證書
6.3.5.3 驗證者規則
驗證者規則用于說明根據該規則,簽名中應有的CMS未簽名屬性,以及如果簽名者沒有給出驗證者需要補充的未簽名屬性。驗證者規則的ASN.1語法結構定義如下:
VerifierRules ::= SEQUENCE {
mandatedUnsignedAttr MandatedUnsignedAttr,
signPolExtensions SignPolExtensions OPTIONAL}
MandatedUnsignedAttr ::= CMSAttrs
6.3.6 證書及撤銷要求
6.3.6.1 證書要求
certificateTrustTrees給出了一組自簽名證書,信任錨點使用這些自簽名證書作為證書路徑處理的起點。其ASN.1語法結構定義如下:
CertificateTrustTrees ::= SEQUENCE OF CertificateTrustPoint
Certi ficateTrustPoint ::= SEQUENCE {
trustpoint Certificate, –自簽名證書
pathLenConstraint [0] PathLenConstraint OPTIONAL,
acceptablePolicySet [1] AcceptablePolicySet OPTIONAL, –如果該字段不出現表示所有策略
nameConstraints [2] NameConstraints OPTIONAL,
policyConstraints [3] PolicyConstraints OPTIONAL }
trustPoint字段中給出在證書路徑處理中作為信任錨點的CA自簽名證書。
pathLenConstraint字段給出從信任錨點開始的證書路徑中CA證書的最大數量。該值為零時,證書路徑中應僅有信任錨點證書和終端實體證書。如果該字段出現則其值應不小于零。如果該字段不出現,則對證書路徑的長度不限制。
pathLenConstraint ::= INTEGER (0..MAX)
acceptablePolicySet字段給出了根據該簽名策略所有可接受的證書策略。其ASN.1語法結構定義如下:
AcceptablePolicySet ::= SEQUENCE OF CertPolicyId
CertPolicyId ::= OBJECT IDENTIFIER
nameConstraints字段給出了證書路徑中所有證書主體名允許的名字空間。對名字的要求適用于subject distinguished name 和subject alternative name。這些限制要求包括允許的名字子樹和不允許的名字子樹。其ASN.1語法結構定義如下:
NameConstraints ::= SEQUENCE {
permittedSubtrees [0] GeneralSubtrees OPTIONAL,
excludedSubtrees [1] GeneralSubtrees OPTIONAL }
GeneralSubtrees ::= SEQUENCE SIZE (1..MAX) OF GeneralSubtree
GeneralSubtree ::= SEQUENCE {
base GeneralName,
minimum [0] BaseDistance DEFAULT 0,
maximum [1] BaseDistance OPTIONAL }
BaseDistance ::= INTEGER (0..MAX)
PolicyConstraints的ASN.1語法結構定義如下:
PolicyConstraints ::= SEQUENCE {
requireExplicitPolicy [0] SkipCerts OPTIONAL,
inhibitPolicyMapping [1] SkipCerts OPTIONAL }
SkipCerts ::= INTEGER (0..MAX)
如果inhibitPolicyMapping字段存在,則該值用于表示在策略映射不再允許前證書路徑中其他證書的數量(包括信任錨點的自簽名證書)。
如果requireExplicitPolicy字段存在,后續的證書中應包含可接受的策略標識符。requireExplicitPolicy字段的值用于表示在需要顯式策略時,證書路徑中其他證書的數量。
6.3.6.2 撤銷要求
RevocRequirements字段定義了對從CRL和/或OCSP響應消息中獲得的用于驗證證書狀態的撤銷信息的最小要求。其ASN.1語法結構定義如下:
CertRevReq ::= SEQUENCE {
endCertRevReq RevReq,
caCerts [0] RevReq}
證書撤銷要求包含以下內容:
endCertRevReq:終端證書(簽名證書,屬性證書和TSA證書);
caCerts: CA證書;
RevReq ::= SEQUENCE {
enuRevReq EnuRevReq,
exRevReq SignPolExtensions OPTIONAL}
EnuRevReq ::= ENUMERATED {
clrCheck (0),
ocspCheck (1),
bothCheck (2),
eitherCheck (3),
noCheck (4),
other (5) }
撤銷要求定義了以下內容:
1) clrCheck: 應根據當前的CRL或ARL進行檢查;
2) ocspCheck:應適用OCSP(見RFC2450)檢查撤銷狀態;
3) bothCheck:應同時做OCSP和CRL檢查;
4) eitherCheck:既可以做OCSP也可以做CRL檢查;
5) noCheck: 不要求檢查。
6.3.7 簽名證書信任條件
簽名證書信任條件(SigningCertTrustCondition)規定了驗證簽名證書時處理證書路徑的信任條件。其ASN.1語法結構定義如下:
SigningCertTrustCondition ::= SEQUENCE {
signerTrustTrees CertificateTrustTrees,
signerRevReq CertRevReq}
6.3.8 時間戳信任條件
時間戳信任條件(TimeStampCondition)規定了用于認證時間戳機構的真實性時驗證證書路徑的信任條件以及對時間戳機構的名字限制。這些信任條件和限制應用于ES-T簽名中的時間戳。
TimestampTrustCondition ::= SEQUENCE {
ttsCertificateTrustTrees [0] CertificateTrustTrees OPTIONAL,
ttsRevReq [1] CertRevReq OPTIONAL,
ttsNameConstraints [2] NameConstraints OPTIONAL,
cautionPeriod [3] DeltaTime OPTIONAL,
signatureTimestampDelay [4] DeltaTime OPTIONAL }
DeltaTime ::= SEQUENCE {
deltaSeconds INTEGER,
deltaMinutes INTEGER,
deltaHours INTEGER,
deltaDays INTEGER }
如果ttsCertificateTrustTrees不存在,則certificateTrustCondition中規定的規則適用于認證時間戳機構的公鑰。
tstrRevReq規定了對從CRL和/或OCSP響應消息中獲得的撤銷信息的最小要求。這些撤銷信息用于驗證ES-T中時間戳的撤銷狀態。
如果ttsNameConstraints沒出現,則除了ttsCertificateTrustTrees以外對于時間戳機構沒有其他的名字限制。
CautionPeriod字段中規定了一個簽名時間之后的謹慎時間段,在這個時間段內簽名者應防止對簽名者公鑰的合法性給予過高的信任,而且在該時間段內任何相關的撤銷都應被通知。ES-C簽名中的撤銷狀態信息應在謹慎時間段后才能夠收集用于驗證電子簽名的狀態。
signatureTimestampDelay字段規定了一個從創建簽名到創建ES-T中的時間戳的最大時間差。如果簽名時間戳與簽名時間屬性(signing-time attribute)中時間的時間差大于signatureTimestampDelay,則該簽名被認為無效。
6.3.9 屬性信任條件
如果attributeTrustConditions字段沒有出現,則在任何驗證策略下任何認證的屬性都不應認為是合法的。該字段的ASN.1語法結構定義如下:
AttributeTrustCondition ::= SEQUENCE {
attributeMandated BOOLEAN, –屬性應出現
howCertAttribute HowCertAttribute,
attrCertificateTrustTrees [0] CertificateTrustTrees OPTIONAL,
attrRevReq [1] CertRevReq OPTIONAL,
attributeConstraints [2] AttributeConstraints OPTIONAL }
如果attributeMandated為真,則下面這些條件認證的屬性應出現,如果為假,則如果沒有屬性的話簽名仍有效。
howCertAttribute字段規定了未認證的屬性是由簽名者“宣布”,還是在屬性證書中認證,或者使用6.1.12中的簽名者屬性定義。
HowCertAttribute ::= ENUMERATED {
claimedAttribute (0),
certifiedAttribtes (1),
either (2) }
attrCertificateTrustTrees字段定義了對所有屬性證書的證書路徑條件,如果該字段不存在,則應用certificateTrustCondition中的規則。
attrRevReq規定從CRL和/或OCSP響應消息中得到的撤銷信息的最小要求。這些要求用于檢查屬性證書的撤銷狀態。
如果attributeConstraints字段不存在,則在該策略下對屬性沒有任何限制。該字段ASN.1定義如下:
AttributeConstraints ::= SEQUENCE {
attributeTypeConstarints [0] AttributeTypeConstraints OPTIONAL,
attributeValueConstarints [1] AttributeValueConstraints OPTIONAL }
如果該字段存在,該字段規定了在該策略下合法的屬性的類型。
AttributeTypeConstraints ::= SEQUENCE OF AttributeType
如果attributeValueConstraints字段存在,則該字段給出了在該策略下合法的屬性值。
AttributeValueConstraints ::= SEQUENCE OF AttributeTypeAndValue
6.3.10 算法限制
如果AlgorithmConstraints字段存在,則該字段給出可以用于特定用途的簽名算法以及最小長度。如果該字段不出現,則表明該策略沒有任何限制。
AlgorithmConstraintSet ::= SEQUENCE {
signerAlgorithmConstraints [0] AlgorithmConstraints OPTIONAL,
eeCertAlgorithmConstraints [1] AlgorithmConstraints OPTIONAL,
caCertAlgorithmConstraints [2] AlgorithmConstraints OPTIONAL,
aaCertAlgorithmConstraints [3] AlgorithmConstraints OPTIONAL,
tsaCertAlgorithmConstraints [4] AlgorithmConstraints OPTIONAL}
AlgorithmConstraints ::= SEQUENCE OF AlgAndLength
AlgAndLength ::= SEQUENCE {
algID OBJECT IDENTIFIER,
minKeyLength INTEGER OPTIONAL,
other SignPolExtensions OPTIONAL}
6.3.11 簽名策略擴展
下面列出的內容還可以有額外的簽名策略規則:
a) 總體簽名策略結構;
b) 簽名驗證策略結構;
c) 通用規則;
d) 承諾規則;
e) 簽名者規則;
f) 驗證者規則;
g) 撤銷要求;
h) 算法限制。
這些擴展應使用ASN.1語法定義,并有對應的對象標識符,其ASN.1語法結構定義如下:
SignPolExtensions ::= SEQUENCE OF SignPolExtn
SignPolExtn ::= SEQUENCE {
extnID OBJECT IDENTIFIER,
extnValue OCTET STRING }
extnID字段應包含該擴展的對象標識符。ExtnValue字段應包含對該擴展的DER編碼。對擴展的定義應包括其語法結構以及對應的語義。
推薦文章: