<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    6.5 事務消息格式

    6.5.1 事務消息格式概述

    本條給出了一套最小的支持PKI事務的消息格式。系統如果想實現這些事務就必須支持這些消息格式,并能夠正確的產生、識別它們。這些消息格式以ASN.1的形式定義;消息利用DER編碼傳輸。

    6.5.2 全體PKI消息組件

    a) PKI 消息
    每個消息有四個組件:
    PKIMessage ::= SEQUENCE {
    header PKIHeader,
    body PKIBody,
    protection [0] PKIProtection OPTIONAL,
    extraCerts [1] SEQUENCE OF Certificate OPTIONAL }
    extraCerts 字段在本標準中用來放簽名的證書序列,后面消息的描述中對這個字段不再具體描述。
    b) PKI 消息頭
    所有的PKI消息都需要頭信息來識別地址和處理。一些頭信息會在傳輸特定包里給出。然而,如果PKI 消息被簽名,這個頭信息也是被保護的。
    下面是消息頭的數據結構:
    PKIHeader ::= SEQUENCE {
    pvno INTEGER { ietf-version2 (1) },
    sender GeneralName, – 標識發送者
    recipient GeneralName, – 標識接收者
    messageTime [0] GeneralizedTime OPTIONAL,
    – 該消息的產生時間(發送者使用)
    – 該時間對接收者來說仍然有意義。
    protectionAlg [1] AlgorithmIdentifier OPTIONAL,
    – 計算保護比特的算法
    senderKID [2] KeyIdentifier OPTIONAL,
    recipKID [3] KeyIdentifier OPTIONAL,
    – 確定用來保護的特定密鑰
    transactionID [4] OCTET STRING OPTIONAL,
    – 確定事務, 也就是說,相應的請求、響應和確認消息的transactionID相同。
    senderNonce [5] OCTET STRING OPTIONAL,
    recipNonce [6] OCTET STRING OPTIONAL,
    – nonces 用來提供重發保護,消息的產生者插入senderNonce;該消息的接收者在相
    – 應消息中插入recipNonce。
    freeText [7] PKIFreeText OPTIONAL,
    – 這可以用來進行一些上下文說明(本字段的設計便于人工閱讀)
    generalInfo [8] SEQUENCE SIZE (1..MAX) OF InfoTypeAndValue OPTIONAL
    – 用來傳遞上下文相關信息
    – (本字段不是主要為人工考慮的)}
    PKIFreeText ::= UTF8String
    頭消息中的transactionID字段允許響應消息的接收者將它與請求相關聯。一個RA或許在同一個時刻有很多請求未被處理。為了做到有效,從發送者的角度看,本字段的取值應當是獨一無二的。
    MessageTime 字段表明消息產生的時間。它的值必須是格林威治時間,必須精確到秒(即年月日時分秒YYYYMMDDHHMMSSZ),即使秒是零。MessageTime 字段不包括分秒。
    sender和recipient字段定義為GeneralName。系統必須支持X.500 標識名和RFC 822(Internet e-mail)標識名。
    freetext 字段定義為PKIFree Text, PKIFree Text 是ASN.1中的UTF8String 型。UTF8String 是統一字符集,它包括了ASCII,本標準中, PKIFree Text 僅包括ASCII中的字符。
    ProtectionAlg 所有的簽名消息,以及用消息認證碼保護的消息都要有該字段。當一個消息不受保護時(即,在含有PKIHeader 的PKIMessage 中不出現 protection 字段時),ProtectionAlg 必須被忽略。
    senderNonce 和 recipNonce 在 client 和 RA 中是不需要的;CA如果收到了帶有senderNonce的PKIMessage, 就必須在隨后的消息里返回recipNonce。本標準中,senderKID, recipKID, generalInfo 是不需要的。
    c) PKI消息正文
    PKIBody ::= CHOICE {
    – message-specific body elements
    cr [2] CertReqMessages, –證書請求
    cp [3] CertRepMessage, –證書響應
    p10cr [4] PKCS10CertReqMessages, –引自[PKCS10]
    rr [11] RevReqContent, –撤銷請求
    rp [12] RevRepContent, –撤銷響應
    conf [19] PKIConfirmContent, –確認}
    其它的 message-specific 正文元素在RFC2510、RFC2511中定義。本標準并不需要這些元素,所以這里把它們省略了。附錄C中描述了message-specific正文元素的完整列表。
    其它部分所說的CertReq、CertRep、RevReq、RevRep在PKIMessage里就是指ir、ip、cr、cp、rr、rp。一個PKCS#10請求是指帶有p10cr 正文元素的消息。一個確認消息帶有正文消息conf。
    d) PKI消息保護
    使用以下結構,所有PKI消息的完整性將得到保護:
    PKIProtection::=BIT STRING
    用來計算PKIProtection的輸入是如下數據結構的DER編碼:
    ProtectedPart::=SEQUENCE{
    Header PKIHeader,
    body PKIBody}
    在大多數情況下,PKIProtection字段將包含一個數字簽名,PKIHeader里的protectionAlg字段將包含一個AlgorithmIdentifier, 用來說明為保護消息所使用的數字簽名算法。

    6.5.3 通用數據結構

    下面的數據類型對幾個消息格式都是通用的。
    a) 證書模板
    在各種各樣的PKI管理消息中,始發者可能會提供一些值來識別一個已存在的證書,或申請一個證書時在請求中含有一些值。CertTemplate結構允許實體標明這些值。CertTemplate包含作為一個證書所需的所有信息。
    CertTemplate ::= SEQUENCE {
    version [0] Version OPTIONAL,
    用來請求特殊語法版本
    serial [1] INTEGER OPTIONAL,
    用來請求一個特殊的序列號或聲明請求代表一個以前的證書持有者
    signingAlg [2] AlgorithmIdentifier OPTIONAL,
    subject [3] Name OPTIONAL,
    validity [4] OptionalValidity OPTIONAL,
    issuer [5] Name OPTIONAL,
    publicKey [6] SubjectPublicKeyInfo OPTIONAL,
    issuerUID [7] UniqueIdentifier OPTIONAL, – not supported
    subjectUID [8] UniqueIdentifier OPTIONAL, – not supported
    extensions [9] Extensions OPTIONAL,
    包含請求者希望在證書里具有的擴展
    }
    OptionalValidity ::= SEQUENCE {
    notBefore [0] Time OPTIONAL,
    notAfter [1] Time OPTIONAL
    }
    CertTemplates ::= SEQUENCE OF CertTemplate
    如果CertTemplate出現,validity字段將包含請求證書的請求發放日期(notbefore字段)和期滿日期(notAfter)。對CertTemplate 中的 validity字段和證書中的 validity 字段的解釋相同。(見5.2.1)
    b) 簽名私鑰的擁有證明
    若由主體產生密鑰對,CA需要驗證證書請求中主體擁有對應于相應公鑰的私鑰。這是通過ProofOfPossession字段來實現的。
    當用戶申請一個簽名證書,則用ProofOfPossession中的signature字段實現的,該signature是一個POPOSigningKey 結構。該結構包含輸入數據、一個算法標識符和一個簽名。
    輸入數據作為DER編碼的popInput,它是由證書請求中的數據生成的。通常,它包含CertTemplate里的主體名和公鑰。當一個新的主體請求通過公鑰mac驗證后,或是RA修改了主體名后,popInput必須由POPOSigningKey結構中的可選數據和CertTemplate里的公鑰構成。這就允許RA把擁有證明傳遞給CA而不用改變CertTemplate。
    ProofOfPossession ::= CHOICE {
    raVerified [0] NULL,
    – 當RA已經驗證了請求者擁有相應私鑰時使用
    signature [1] POPOSigningKey,
    – 用戶產生證書密鑰對,并申請簽名證書時使用
    keyEncipherment [2] POPOPrivKey,
    – 本標準不使用該域
    keyAgreement [3] POPOPrivKey
    – 本標準不使用該域}
    POPOSigningKey ::= SEQUENCE {
    poposkInput [0] POPOSKInput OPTIONAL,
    algorithmIdentifier AlgorithmIdentifier,
    signature BIT STRING }
    – 對popInput的DER編碼值簽名(用”algorithmIdentifier”)
    – 注意: 如果在pop字段里出現poposkInput, popInput 就由otherinput構成。
    – 如果 poposkInput 沒有出現, 主體就是CertTemplate中的名字。
    – 注意PopInput的編碼值是有意含糊的。
    PoposkInput ::= CHOICE {
    Subject name,
    Sender [0] generalName,
    publicKeyMAC [1] PKMACValue}
    – pop的計算是基于popInput的結構的。 PopInput的結構定義如下:
    PopInput ::= SEQUENCE {
    CHOICE {
    otherinput popskInput,
    subject name },
    publicKey subjectpublicKey}
    – 如果poposkInput在pop字段出現的話,popInput 就用otherinpu構成。 如果 poposkInput 不出現,主體就是CertTemplate中的名字。
    – 注意PopInput的編碼值是有意含糊的。
    c) 證書請求消息
    CertReqMsg 是證書請求的基本結構。CertReqMsg 由三個字段構成的SEQUENCE , certReq; pop; regInfo(可選)。 certReq是類型CertRequest, pop 包括了證明擁有私鑰的信息,regInfo包含了特定的注冊過程信息。 regInfo字段是可選的。CertReqMsg定義見附錄D。
    CertReqMsg ::= SEQUENCE {
    certReq CertRequest,
    pop ProofOfPossession OPTIONAL,
    – 本標準規定加密密鑰對必須集中產生,此時該字段不出現
    – 若集中產生簽名密鑰對,則該字段不出現
    – 若是由終端實體產生簽名密鑰對,則該字段必須出現
    regInfo SEQUENCE SIZE(1..MAX) of AttributeTypeAndValue OPTIONAL }
    CertRequest
    CertRequest 的組成包括:請求標識符,證書模板, 可選的控制信息。
    CertRequest ::= SEQUENCE {
    certReqId INTEGER, – 用來匹配請求和相應的ID
    certTemplate CertTemplate, – 選定的證書中的某些字段
    controls Controls OPTIONAL } – 控制頒發的一些屬性
    certReqId 是一個 INTEGER, certTemplate 是 CertTemplate ,controls 的定義如下。
    CertReqMessages
    CertReqMessages 是一個或多個CertReqMessage 序列的結構。
    CertReqMessages ::= SEQUENCE SIZE (1..MAX) OF CertReqMessage
    本標準中,CertReqMessages 可以假設為僅由一個CertReqMessage構成的SEQUENCE。即 MAX 可以定義為1。
    Controls
    CertRequest 的產生者可以包括一個或多個適合請求處理的control值。
    Controls ::= SEQUENCE SIZE (1..MAX) OF AttributeTypeAndValue
    下列control 在證書管理協議(CMP)里有定義: regToken; authenticator; pkiPublicationInfo; pkiArchiveOptions; oldCertId; protocolEncrKey。在具體實現規范中的事務時,這些control是可選的。 這些 control 的OIDs 如下。 本標準不需要的control (oldCertId, regToken, authenticator, pkiPublicationInfo, and pkiArchiveOptions)在這里沒有描述。
    id-pkix OBJECT IDENTIFIER ::= { iso(1) identified-organization(3)
    dod(6) internet(1) security(5) mechanisms(5) pkix(7) }
    – arc for Internet X.509 PKI protocols and their components
    id-pkip OBJECT IDENTIFIER :: { id-pkix pkip(5) }
    – Registration Controls in CRMF
    id-regCtrl OBJECT IDENTIFIER ::= { id-pkip regCtrl(1) }
    id-regCtrl-oldCertId OBJECT IDENTIFIER ::= { id-regCtrl 5 }
    id-regCtrl-protocolEncrKey OBJECT IDENTIFIER ::= { id-regCtrl 6 }
    d) 協議加密密鑰控制
    如果存在的話,協議加密密鑰控制明確了CA用來對CertReqMessages的響應進行加密的密鑰。
    當CA發送給申請者的信息需要加密的時候就可以使用這一控制。 這些信息包括CA把產生的私鑰發給申請者供其使用。
    protocolEncrKey 控制由屬性類型里的id-reg-protocolEncrKey 的OID來確定。它的值的語法是 SubjectPublicKeyInfo.
    e) PKI消息狀態碼
    所有的響應消息都包含一些狀態信息。定義如下的取值:
    PKIStatus ::= INTEGER {
    granted (0),
    請求得到許可,沒有變更
    grantedWithMods (1),
    請求得到許可,有變更; 請求者負責確定變更。
    rejection (2),
    請求被拒絕
    waiting (3),
    已收到請求但還未處理,處理后將會附加一個響應
    revocationWarning (4),
    給予警告:撤銷已被請求,正在處理。
    revocationNotification (5),
    –通知:已經撤銷
    keyUpdateWarning (6) }
    本標準并未用到KeyUpdateWarning狀態碼。
    f) 失敗信息
    響應者使用以下句法提供更多失敗信息。
    PKIFailureInfo ::= BIT STRING { 因為會以多種方式失敗!
    badAlg (0), – 不被識別或不被支持算法名
    badMessageCheck (1), – 完整性檢查失敗(例如, 簽名核對錯誤)
    badRequest (2), – 事務不被允許或支持
    badTime (3), – messageTime與系統時間相差太多
    badCertId (4), – 證書標識名錯
    badDataFormat (5), – 數據格式不對
    wrongAuthority (6), – 請求中指出的 authority 和響應者不同
    incorrectData (7), – 請求者的數據不對 (在公證服務里用)
    missingTimeStamp (8), – 沒有時戳,但是策略需要
    badPoP (9) – 擁有證明字段核實失敗,
    – 需要更多的失敗信息}
    PKIStatusInfo ::= SEQUENCE {
    status PKIStatus,
    statusString PKIFreeText OPTIONAL,
    failInfo PKIFailureInfo OPTIONAL}
    g) 確認協議
    確認消息會在PKIHeader中帶著所需的所有信息。因此,該數據結構內容為空。
    PKIConfirmCotent::=NULL
    h) 證書識別
    為了識別特定的證書,采用了CerId結構
    CerId::=SEQUENCE{
    issuer GeneralName,
    serialNumber INTEGER}
    i) Centrally Generated Keys
    本標準規定由第三方集中產生加密密鑰對并通過帶外方式提供給CA, 此時CA用CertifiedKeyPair結構發還證書。
    CertifiedKeyPair ::= SEQUENCE {
    certificate [0] Certificate OPTIONAL,
    encryptedCert [1] EncryptedValue OPTIONAL,
    privateKey [2] EncryptedValue OPTIONAL,
    publicationInfo [3] PKIPublicationInfo OPTIONAL }
    EncryptedValue ::= SEQUENCE {
    intendedAlg [0] AlgorithmIdentifier OPTIONAL,
    – the intended algorithm for which the value will be used
    symmAlg [1] AlgorithmIdentifier OPTIONAL,
    – 加密這一value的對稱算法
    encSymmKey [2] BIT STRING OPTIONAL,
    – 用來加密這一value的對稱密鑰(已加密)
    keyAlg [3] AlgorithmIdentifier OPTIONAL,
    – 用來加密對稱密鑰的算法
    valueHint [4] OCTET STRING OPTIONAL,
    – encValue 內容的簡要描述或標識符
    – (可能只對發送實體有意義,僅當將來發送實體對EncryptedValue重新檢查時使用)
    encValue BIT STRING
    – 加密的 value}
    j) 帶外信息
    為了在帶外傳輸一個CA的公鑰,采用了OOBCert結構。OOBCert只是一個CA的證書。
    OOBCert::=Certificate
    6.5.4 特殊操作的數據結構
    a) 注冊/證書請求
    注冊和證書請求消息(cr)包含一個CertReqMessages 的數據結構,該結構規范了請求證書的特定取值。
    CertReqMessages 是CertReqMsg結構的一個或多個序列。
    CertReqMessages ::= SEQUENCE SIZE (1..MAX) OF CertReqMsg
    例外的,本標準里定義的事務假設CertReqMessages僅是一個CertReqMsg的SEQUENCE。同時請簽名證書和加密證書的可選事務請求要求CertReqMessages 是大小為2的SEQUENCE。本標準不鼓勵同時申請兩個證書,但不禁止。
    b) 注冊/證書響應
    注冊響應消息(cp)包含一個CerRepMessage結構(一個可選的公鑰和一個response)。特別的,本標準里定義的事務都假設響應僅是一個CertResponse的序列。一個例外就是含有簽名證書和加密證書請求的事務;該事務的響應可以是響應消息的結合,即含有兩個CertResponse的字段的序列。
    CertResponse包含一個請求id、狀態信息和一個CertifiedKeyPair(可選)。CertifiedKeyPair是一個包含四個可選字段的序列,四個可選字段分別是:一個證書,一個已加密證書、一個已加密私鑰,以及公開信息。本標準中,證書字段總出現在CertifiedKeyPair里。僅當集中產生密鑰管理密鑰時才用到PrivateKey,其余字段均不出現。
    CertRepMessage ::= SEQUENCE {
    caPub [1] Certificate OPTIONAL,
    response SEQUENCE OF CertResponse}
    CertResponse ::= SEQUENCE {
    certReqId INTEGER, –與相應的請求相匹配
    certRepStatus PKIStatusInfo,
    certifiedKeyPair CertifiedKeyPair OPTIONAL;
    -只有當狀態為granted或grantedWithMods才存在
    rspInfo OCTET STRING OPTIONAL
    – analogous to the id-regInfo-asciiPairs OCTET STRING defined
    – for regInfo in CertReqMsg [CRMF]}
    如果certRepStatus包含failInfo字段,CertResponse將不包含certifiedKeyPair 并且certRepStatus字段的status 的值將是rejection. status 的值是 waiting 時,可選字段就都不出現。status 的值 revocationWarning 和 revocatonNotification不會在消息中出現。
    caPub 和 rspInfo 字段是不需要的,如果它們出現的話可以被忽略。本標準并不使用CertifiedKeyPair中的encryptedCert 和 publicationInfo 字段。
    c) 撤銷請求的內容
    當請求撤銷一個證書時采用以下數據結構。請求者的名字在PKIHeader中顯示。
    RevReqContent ::= SEQUENCE OF RevDetails
    RevDetails ::= SEQUENCE OF {
    certDetails CertTemplate,
    允許請求者盡可能多的指定所請求撤銷的證書的參數(例如,不知道序列號時)
    revocationReason ReasonFlags,
    來自DAM, 這樣CA 就知道該用哪個Dist. point
    badSinceDate GeneralizedTime OPTIONAL,
    – indicates best knowledge of sender
    crlEntryDetails Extensions
    要求的 crlEntryExtensions}
    ReasonFlags定義見附錄B。 為清楚起見這里再說明一遍。
    ReasonFlags ::= BIT STRING {
    unused (0),
    keyCompromise (1),
    caCompromise (2),
    affiliationChanged (3),
    superseded (4),
    cessationOfOperation (5),
    certificateHold (6),
    removeFromCRL (8) }
    badSinceDate 和 revocationReason 表示的信息可以在 crlEntryDetails 中也同樣表示出來,使用標準的X.509 CRL 擴展 invalidityDate 和 reasonCode。推薦的位置是crlEntryDetails,不過本標準建議CA處理其它位置的信息。當有沖突存在的時候,使用較早的日期。當撤銷原因不匹配時,CA應包括所有的原因。
    d) 撤銷響應內容
    當對撤銷請求做響應時,使用以下數據結構。把它發送給請求者。
    RevRepContent ::= SEQUENCE {
    status PKIStatusInfo,
    revCerts [0] SEQUENCE OF CertId OPTIONAL,
    確定要請求撤銷的證書
    crls [1] SEQUENCE OF CertificateList OPTIONAL,
    作為結果的相應的RL}
    在本標準中,revCerts 是一個或多個 CertID 字段的SEQUENCE,crls字段并不出現。
    e) PKCS#10 證書請求
    這個證書請求句法在RFC 2314中有定義,為清楚起見在此重復一遍。
    PKCS10CertReqContent ::= SEQUENCE {
    certificationRequestInfo CertificationRequestInfo
    signatureAlgorithm SignatureAlgorithmIdentifier,
    signature Signature}
    SignatureAlgorithmIdentifier ::= AlgorithmIdentifier
    Signature ::= BIT STRING
    CertificationRequestInfo::= SEQUENCE {
    version Version,
    subject Name,
    subjectPublicKeyInfo SubjectPublicKeyInfo,
    attributes [0] IMPLICIT Attributes}
    Version ::= INTEGER
    Attributes ::= SET OF Attribute
    Attributes 在RFC 2985中有定義。為了互操作而對Attributes 的支持是可選的。 即使出現了,也可以被忽略。

    本文章首發在 網安wangan.com 網站上。

    上一篇 下一篇
    討論數量: 0
    只看當前版本


    暫無話題~
    亚洲 欧美 自拍 唯美 另类