Опубликован: 26.01.2005 | Уровень: специалист | Доступ: платный | ВУЗ: Московский государственный университет имени М.В.Ломоносова
Лекция 6:

Инфраструктура Открытого Ключа (часть 6)

Синтаксис CertRequest

Синтаксис CertRequest состоит из запроса идентификатора, шаблона содержимого сертификата и дополнительной последовательности управляющей информации.

CertRequest ::= SEQUENCE {
  certReqId INTEGER,  
  -- ID для обеспечения соответствия
  -- между запросом и ответом
  certTemplate CertTemplate,  
  -- поля из сертификата, который
  -- должен быть выпущен 
  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. Синтаксис доказательства обладания

Считается, что протоколы должны включать подтверждающее сообщение для сообщения вызов-ответ.

Использование МАС, основанного на пароле

Следующий алгоритм должен применяться при использовании publicKeyMAC в POPOSigningKeyInput для доказательства аутентичности запроса.

PBMParameter ::= SEQUENCE {
  salt OCTET STRING,
  owf AlgorithmIdentifier,
    -- AlgId для One-Way Function
    -- (SHA-1 рекомендуется)
  iterationCount INTEGER,
    -- сколько раз применяется OWF 
  mac AlgorithmIdentifier
    -- the MAC AlgId (например,
    -- DES-MAC, Triple-DES-MAC,
    -- или HMAC) }

Процесс, использующий PBMParameter вычисления publicKeyMAC и тем самым аутентифицирующий исходный запрос сертификата открытого ключа, состоит из двух стадий. Первая стадия использует разделяемую секретную информацию для создания ключа МАС. На второй стадии вычисляются MACs открытых ключей, с помощью данного ключа МАС для создания аутентифицирующего значения.

Инициализация первой стадии алгоритма предполагает существование разделяемого секрета, полученного надежным способом CA/RA и конечным участником. Значение salt присоединяется к разделяемому секрету, и односторонняя функция ( owf ) применяется iterationCount раз, где секрет и salt являются входом в первую итерацию, и для каждой следующей итерации вход есть множество выходов предыдущей итерации, включая ключ K.

На второй стадии K и открытый ключ являются входами в НМАС, в результате чего создается значение для publicKeyMAC следующим образом:

publicKeyMAC = Hash( K XOR opad,
  Hash( K XOR ipad, public key) )

где ipad и opad определены в RFC 2104.

Управление публикуемой информацией

Управление pkiPublicationInfo необходимо подписчикам для управления опубликованием СА сертификата. Определен следующий синтаксис:

PKIPublicationInfo ::= SEQUENCE {
  action INTEGER {
    dontPublish (0),
    pleasePublish 1) },
  pubInfos SEQUENCE SIZE (1..MAX)
    OF SinglePubInfo OPTIONAL }
  -- pubInfos не должно присутствовать,
  -- если действие есть "dontPublish" 
  -- (если действие есть 
  -- "pleasePublish" и pubInfos опущено,
  -- предполагается "dontCare")
SinglePubInfo ::= SEQUENCE {
  pubMethod    INTEGER {
    dontCare       (0),
    x500           (1),
    web           (2),
    ldap           (3) },
  pubLocation   GeneralName OPTIONAL }

Если выбрана опция dontPublish, запрашивающий указывает, что PKI не должно публиковать сертификат (это может означать, что запрашивающий сам опубликует сертификат).

Если выбран метод dontCare или если управление PKIPublicationInfo в запросе опущено, запрашивающий указывает, что PKI может опубликовать сертификат, используя любой выбранный им способ.

Если запрашивающему нужно, чтобы сертификат появился, по крайней мере, в некоторых местах и при этом он хочет допустить, чтобы СА сделал сертификат доступным для других репозиториев, следует установить два значения SinglePubInfo для pubInfos: одно со значением x500, web или ldap, и другое – с dontCare.

Поле pubLocation, если имеется, указывает, где запрашивающий хочет разместить сертификат (заметим, что CHOICE в GeneralName включает, например, URL и IP адрес).

Управление опциями архивирования

Управление pkiArchiveOptions дает подписчикам возможность указать информацию, необходимую для установления архивирования закрытого ключа, соответствующего открытому ключу из запроса сертификата. Это определяется следующим синтаксисом:

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. Синтаксис управления опциями архивирования

Альтернативой посылки ключа является посылка информации о том, как заново создать ключ, используя выбор KeyGenParameters (например, для многих реализаций RSA можно послать первое случайное простое число).

Евгений Виноградов
Евгений Виноградов

Прошел экстерном экзамен по курсу перепордготовки "Информационная безопасность". Хочу получить диплом, но не вижу где оплатить? Ну и соответственно , как с получением бумажного документа?

Илья Сидоркин
Илья Сидоркин

Добрый день! Подскажите пожалуйста как и когда получить диплом, после сдичи и оплаты?????