PKIBody ::= CHOICE { -- элементы, специфичные для конкретного сообщения ir [0] CertReqMessages, -- Initialization Request ip [1] CertRepMessage, -- Initialization Response cr [2] CertReqMessages, -- Certification Request cp [3] CertRepMessage, -- Certification Response p10cr [4] CertificationRequest, -- PKCS #10 -- Certification Request popdecc [5] POPODecKeyChallContent, -- pop Challenge popdecr [6] POPODecKeyRespContent, -- pop Response kur [7] CertReqMessages, -- Key Update Request kup [8] CertRepMessage, -- Key Update Response krr [9] CertReqMessages, -- Key Recovery Request krp [10] KeyRecRepContent, -- Key Recovery Response rr [11] RevReqContent, -- Revocation Request rp [12] RevRepContent, -- Revocation Response ccr [13] CertReqMessages, -- Cross-Cert. Request ccp [14] CertRepMessage, -- Cross-Cert. Response ckuann [15] CAKeyUpdAnnContent, -- CA Key Update Ann. cann [16] CertAnnContent, -- Certificate Ann. rann [17] RevAnnContent, -- Revocation Ann. crlann [18] CRLAnnContent, -- CRL Announcement conf [19] PKIConfirmContent, -- Confirmation nested [20] NestedMessageContent, -- Nested Message genm [21] GenMsgContent, -- General Message genp [22] GenRepContent, -- General Response error [23] ErrorMsgContent -- Error Message } |
Листинг 18.1. Синтаксис тела сообщения PKI |
Закрыть окно |
PKIStatus ::= INTEGER { Granted (0), -- получено то, что запрашивалось grantedWithMods (1), -- получено что-то подобное, что запрашивалось; -- запрашивающий несет ответственность за -- установленные отличия rejection (2), -- не получено то, что запрашивалось, -- более подробная информация в сообщении waiting (3), -- запрос не обработан, -- следует запросить позднее revocationWarning (4), -- данное сообщение содержит предупреждение, -- что скоро будет отмена revocationNotification (5), -- уведомление, что произошла отмена keyUpdateWarning (6) -- изменение уже выполнено для oldCertId, -- указанного в сообщении запроса изменения ключа } |
Листинг 18.2. Коды статуса PKI-сообщений |
Закрыть окно |
PKIFailureInfo ::= BIT STRING { -- причин неудачи может быть много -- при необходимости в будущем могут -- быть добавлены другие коды причин. badAlg (0), -- нераспознанный или неподдерживаемый -- Идентификатор Алгоритма badMessageCheck (1), -- сбой в процессе проверки целостности -- (например, подпись не верифицирована) badRequest (2), -- транзакция не разрешена или не поддерживается badTime (3), -- messageTime недостаточно точно -- соответствует системному времени, -- как определено локальной политикой badCertId (4), -- сертификат не может быть найден в -- соответствии с предоставленным критерием badDataFormat (5), -- переданные данные имеют -- неправильный формат wrongAuthority (6), -- уполномоченный орган, указанный -- в запросе, отличается от того, -- который определен в токене ответа incorrectData (7), -- данные из запроса являются некорректными -- (используется для сервисов нотариуса) missingTimeStamp (8), -- когда timestamp опущена, но -- должна присутствовать -- (в соответствии с политикой) badPOP (9) -- упал РОР } PKIStatusInfo ::= SEQUENCE { status PKIStatus, statusString PKIFreeText OPTIONAL, failInfo PKIFailureInfo OPTIONAL } |
Листинг 18.3. Синтаксис для предоставления подробной информации о причинах неудачи PKI-сообщений |
Закрыть окно |
POPODecKeyChallContent ::= SEQUENCE OF Challenge -- один Challenge на запрос сертификата ключа -- шифрования (в той же последовательности, что и -- другие запросы, появляющиеся в CertReqMessages). Challenge ::= SEQUENCE { owf AlgorithmIdentifier OPTIONAL, -- должен присутствовать в первом Challenge; может -- быть опущен в любом следующем Challenge в -- POPODecKeyChallContent (если опущен, то owf -- используется в немедленно создаваемом Challenge). witness OCTET STRING, -- результат применения односторонней функции (owf) -- к случайно созданному целому A. Заметим, что для -- каждого Challenge должны использоваться различные -- целые. challenge OCTET STRING -- шифрование (с использованием открытого ключа, для -- которого выполнен запрос сертификата) Rand, где -- Rand специфицирован как -- Rand ::= SEQUENCE { -- int INTEGER, -- – случайно созданное целое A (определено выше) -- sender GeneralName -- – имя отправителя (как определено в PKIHeader) -- } } POPODecKeyRespContent ::= SEQUENCE OF INTEGER -- один INTEGER на каждый запрос сертификата для -- ключа шифрования (в порядке появления этих -- запросов в CertReqMessages). Восстановленный -- INTEGER A возвращается отправителю в -- соответствующем Challenge. |
Листинг 18.4. Сообщения вызова-ответа для доказательства обладания закрытым ключом |
Закрыть окно |
InfoTypeAndValue ::= SEQUENCE { infoType OBJECT IDENTIFIER, infoValue ANY DEFINED BY infoType OPTIONAL } -- пример содержимого InfoTypeAndValue включает, но не -- ограничивается : -- { CAProtEncCert = {id-it 1}, Certificate } -- { SignKeyPairTypes = {id-it 2}, SEQUENCE OF -- AlgorithmIdentifier } -- { EncKeyPairTypes = {id-it 3}, SEQUENCE OF -- AlgorithmIdentifier } -- { PreferredSymmAlg = {id-it 4}, AlgorithmIdentifier } -- { CAKeyUpdateInfo = {id-it 5}, CAKeyUpdAnnContent } -- { CurrentCRL = {id-it 6}, CertificateList } -- где {id-it} = {id-pkix 4} = {1 3 6 1 5 5 7 4} -- данная конструкция может также использоваться для -- определения новых сообщений запроса и ответа PKIX -- Certificate Management Protocol, или для сообщений, -- используемых для общих целей, которые могут -- понадобиться в будущем в конкретных окружениях. GenMsgContent ::= SEQUENCE OF InfoTypeAndValue -- Может быть послано EE, RА или СA (в зависимости от -- содержимого сообщения). Параметр OPTIONAL infoValue -- для InfoTypeAndValue для примеров, приведенных -- ниже, обычно опущен. Получатель может игнорировать -- все, что содержит OBJ.IDs, которые не распознаны. -- Если посылается от EE к CA, то пустое множество -- указывает, что СA может послать всю/любую -- интересующую информацию. |
Листинг 18.5. Содержимое общего сообщения PKI |
Закрыть окно |
CertRequest ::= SEQUENCE { certReqId INTEGER, -- ID для обеспечения соответствия -- между запросом и ответом certTemplate CzertTemplate, -- поля из сертификата, который -- должен быть выпущен controls Controls OPTIONAL -- атрибуты, используемые при -- выпуске сертификата } CertTemplate ::= SEQUENCE { version [0] Version OPTIONAL, serialNumber [1] INTEGER OPTIONAL, signingAlg [2] AlgorithmIdentifier OPTIONAL, issuer [3] Name OPTIONAL, validity [4] OptionalValidity OPTIONAL, subject [5] Name OPTIONAL, publicKey [6] SubjectPublicKeyInfo OPTIONAL, issuerUID [7] UniqueIdentifier OPTIONAL, subjectUID [8] UniqueIdentifier OPTIONAL, extensions [9] Extensions OPTIONAL } OptionalValidity ::= SEQUENCE { notBefore [0] Time OPTIONAL, notAfter [1] Time OPTIONAL } -- по крайней мере, одно должно быть -- представлено Time ::= CHOICE { utcTime UTCTime, generalTime GeneralizedTime } |
Листинг 18.6. Синтаксис CertRequest |
Закрыть окно |
ProofOfPossession ::= CHOICE { raVerified [0] NULL, -- используется, если RA уже убедился, что -- запрашивающий обладает закрытым ключом signature [1] POPOSigningKey, keyEncipherment [2] POPOPrivKey, keyAgreement [3] POPOPrivKey } POPOSigningKey ::= SEQUENCE { poposkInput [0] POPOSigningKeyInput OPTIONAL, algorithmIdentifier AlgorithmIdentifier, signature BIT STRING -- Подпись (используя "algorithmIdentifier") является -- значением в DER-представлении poposkInput. -- Замечание: если CertReqMsg certReq CertTemplate -- содержит значения subject и publicKey, то poposkInput -- должно быть опущено и подпись должна быть вычислена -- для DER-представления значения CertReqMsg certReq. -- Если CertReqMsg certReq CertTemplate не содержит -- значения открытого ключа и субъекта, то poposkInput -- должно присутствовать и должно быть подписано. Данная -- стратегия гарантирует, что открытый ключ не -- присутствует в полях poposkInput и CertReqMsg certReq -- CertTemplate. } POPOSigningKeyInput ::= SEQUENCE { authInfo CHOICE { sender [0] GeneralName, -- используется только если установлена -- аутентифицированная идентификация для отправителя -- (т.е. DN из ранее выпущенного или действительного -- в настоящий момент сертификата) publicKeyMAC PKMACValue }, -- используется, если в настоящий момент нет -- аутентифицированного GeneralName отправителя; -- publicKeyMAC содержит MAC, основанный на пароле, -- в DER-представлении значения publicKey publicKey SubjectPublicKeyInfo -- из CertTemplate } PKMACValue ::= SEQUENCE { algId AlgorithmIdentifier, -- значение алгоритма должно быть PasswordBasedMac -- {1 2 840 113533 7 66 13}, значение параметра есть -- значение PBMParameter BIT STRING } POPOPrivKey ::= CHOICE { thisMessage [0] BIT STRING, -- доказательство, представленное в данном сообщении -- (содержит сам закрытый ключ, зашифрованный для СА) subsequentMessage [1] SubsequentMessage, -- доказательство приведено в следующем сообщении dhMAC [2] BIT STRING -- для keyAgreement (только) доказательство -- приведено в данном сообщении, которое содержит -- MAC (для значения DER-представления параметра -- certReq в CertReqMsg, которое должно включать и -- subject, и publicKey), основываясь на ключе, -- полученном из закрытого ключа DH конечного -- участника и открытого ключа DH СА. } SubsequentMessage ::= INTEGER { encrCert (0), -- запросы, при которых результирующий сертификат -- зашифрован для конечного участника (при этом POP -- будет выполнен в подтверждающем сообщении) challengeResp (1) -- запросы, при которых CA/RA обязан выполнить обмен -- вызов-ответ с конечным участником, чтобы доказать, -- что ему известен закрытый ключ } |
Листинг 18.7. Синтаксис доказательства обладания |
Закрыть окно |
PKIArchiveOptions ::= CHOICE { encryptedPrivKey [0] EncryptedKey, -- реальное значение закрытого ключа keyGenParameters [1] KeyGenParameters, -- параметры, которые допускают -- перегенерацию закрытого ключа archiveRemGenPrivKey [2] BOOLEAN -- установлено в TRUE, если отправитель -- хочет, чтобы получатель архивировал -- закрытый ключ или пару ключей, -- которые создал получатель в ответ -- на данный запрос; -- установлено в FALSE, если архивация -- не предполагается. } EncryptedKey ::= CHOICE { encryptedValue EncryptedValue, envelopedData [0] EnvelopedData -- зашифрованный закрытый ключ должен -- быть размещен в -- envelopedData encryptedContentInfo -- encryptedContent -- OCTET STRING. } EncryptedValue ::= SEQUENCE { intendedAlg [0] AlgorithmIdentifier OPTIONAL, -- предполагаемый алгоритм, для -- которого будет -- использоваться значение symmAlg [1] AlgorithmIdentifier OPTIONAL, -- симметричный алгоритм, используемый -- для шифрования значения encSymmKey [2] BIT STRING OPTIONAL, -- (зашифрованный) симметричный ключ, -- используемый для шифрования значения keyAlg [3] AlgorithmIdentifier OPTIONAL, -- алгоритм, используемый для -- шифрования симметричного ключа valueHint [4] OCTET STRING OPTIONAL, -- краткое описание или идентификатор -- содержимого encValue (может иметь -- значение только для посылающего и -- использоваться только если -- EncryptedValue должно перепроверяться -- посылающим в будущем) encValue BIT STRING } KeyGenParameters ::= OCTET STRING |
Листинг 18.8. Синтаксис управления опциями архивирования |
Закрыть окно |