Опубликован: 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 можно послать первое случайное простое число).

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

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

Наталья Шульга
Наталья Шульга

Курс "информационная безопасность" .

Можно ли на него записаться на ПЕРЕПОДГОТОВКУ по данному курсу? Выдается ли диплом в бумажном варианте и высылается ли он по почте?

Ярослав Ханько
Ярослав Ханько
Украина
Jacob Liberman
Jacob Liberman
Нидерланды, Amsterdam