В этой лекции будут рассматриваться управляющие протоколы PKI.
Сначала мы сделаем общий обзор проблем в области
PKI должна быть организована таким образом, чтобы быть согласованной с различными типами администрирования. Предоставление администраторам альтернатив в использовании не связанных между собой функциональных возможностей не только ведет к усложнению ПО, но и увеличивает вероятность того, что незначительная ошибка администратора или разработчика ПО приведет к большим проблемам, связанным с безопасностью. Аналогично, ограничение администраторов громоздкими механизмами приведет к тому, что они не будут использовать PKI.
Все конечные участники требуют локального безопасного доступа к некоторой информации – как минимум к своему собственному имени и закрытому ключу, имени СА, который является доверенным для данного участника, и открытому ключу СА (или дайджесту открытого ключа, если допустима самосертифицированная версия). Может использоваться локальное безопасное хранение и для большего количества информации (например, сертификата конечного участника или информации, относящейся к приложению). Форма хранения также может быть различной – от файлов до неподделываемых криптографических токенов. Такое локальное доверенное хранение мы будем определять как персональное безопасное окружение (Personal Security Environment –
Хотя форматы
Рассматриваемые протоколы должны удовлетворять следующим требованиям к управлению PKI.
PKIConfirm -сообщения).Множество операций, для которых определены управляющие сообщения, могут быть сгруппированы следующим образом.
subject CA и issuer CA различны, и SubjectPublicKeyInfo содержит ключ проверки (например, сертификат выпущен для пары ключей подписывания subject CA). Когда необходимо более тонкое различие, могут использоваться следующие термины: subject и issuer CA принадлежат различным административным доменам; в противном случае он называется внутридоменным Замечание 1. Во многих окружениях термин
Замечание 2. Выпуск
Заметим, что on-line протоколы являются не единственным способом реализации перечисленных выше операций. Для всех операций существуют off-line методы, с помощью которых можно добиться того же самого результата, и в принципе никто не требует задействовать исключительно on-line протоколы. Например, если используется аппаратный токен, многие операции могут быть получены как часть физической доставки токена.
Далее определим множество стандартных сообщений, поддерживающих перечисленные выше операции. Также определим протоколы для доставки этих сообщений в различных окружениях (на основе различных протоколов).
Первым действием конечного участника является запрос информации о поддерживаемых функциях PKI и безопасное получение открытого ключа (ключей) соответствующего корневого СА.
Существует много схем, которые могут использоваться для обеспечения начальной
Однако можно классифицировать схемы начальной
Составив классификацию схем, мы определим некоторые из них как обязательные и некоторые – как дополнительные. Обязательные схемы должны охватывать достаточное количество реальных случаев, в то время как дополнительные схемы применяются в исключительных случаях, которые возникают реже. Таким образом можно добиться баланса между гибкостью и легкостью реализации.
Рассмотрим классификацию схем начальной
Пользуясь терминами создаваемых сообщений PKI, можно сказать, что инициализация начальных обменов
On-line сообщения, созданные конечным участником, запрашивающим сертификат, могут быть как аутентифицированы, так и нет. Требованием является аутентификация подлинности любых сообщений от конечного участника к PKI (CA/RA).
Подобная аутентификация может обеспечиваться следующим образом: PKI (CA/RA) передает конечному участнику секретное значение (ключ начальной аутентификации) и справочное значение (используемое для идентификации транзакции) некоторыми внешними способами. Ключ начальной аутентификации может затем использоваться для защиты соответствующих значений PKI.
Мы можем таким образом классифицировать схемы начальной
Замечание 1: мы не рассматриваем аутентификацию сообщений PKI к EE, т.к. она требуется ВСЕГДА. В любом случае открытый ключ СА может быть инсталлирован в оборудовании конечного участника или аутентификация может быть основана на ключе начальной аутентификации.
Замечание 2: процедура начальной
Будем считать, что "генерация ключа" происходит всякий раз, когда открытый или закрытый компоненты ключа впервые появляется в PKIMessage. Заметим, что это не препятствует централизованному сервису генерации ключа – реальная пара ключа может быть создана где-то еще и передана конечному участнику, RA или СА с использованием (собственного или стандартного) протокола запроса/ответа генератора ключа.
Существует три возможных размещения "генератора ключа": конечный участник, RA или СА.
После создания начального сертификата для конечного участника дополнительная гарантия может быть достигнута тем, что конечный участник явно подтверждает успешное получение сообщения, содержащего сертификат или указывающего на его создание. Естественно, это подтверждающее сообщение должно быть защищено (с помощью ключа начальной аутентификации или другим способом).
СА создает и передает конечному участнику данные активации – значения данных, отличные от ключей, необходимые для функционирования
Это дает две возможности: с подтверждением или без.
Приведенная выше классификация применима для большого числа схем начальной
В терминах приведенной выше классификации данная схема является самой простой:
В терминах потока сообщений данная схема означает, что требуется, чтобы было послано только сообщение от СА к конечному участнику. Сообщение должно содержать весь
В терминах приведенной выше классификации данная схема определяется следующим образом:
В терминах потока сообщений базовая схема аутентификации будет следующей (см. рис.18.1).
Если проверка подтверждающего сообщения не проходит, RA/CA должен отменить только что выпущенный сертификат, если он был опубликован или сделан доступным каким-либо еще способом.
(рис 18.1) Базовая схема аутентификацииДанная спецификация явно предназначена для случаев, когда конечный участник предоставляет соответствующее доказательство для RA, и RA затем сообщает СА, что доказательство получено (и проверено). Например, конечный участник, который хочет иметь сертифицированный ключ подписывания, может послать соответствующую подпись в RA, который затем уведомит СА, что конечный участник предоставил необходимое доказательство. Однако такая ситуация допустима не всегда (например, СА может допускать проверку
Для ключей подписывания конечный участник может подписать значение для доказательства обладания закрытым ключом.
Для ключей шифрования у конечного участника можно потребовать дешифровать значение, чтобы доказать, что ему известен закрытый ключ. Дешифрованное значение может быть получено прямо или косвенно.
Прямой метод состоит в том, что CA/RA создает случайный вызов, на который требуется немедленный ответ ЕЕ.
Рекомендуется задействовать
Для ключей согласования ключа конечный участник и CA/RA должны установить разделяемый секретный ключ, чтобы доказать, что конечный участник обладает закрытым ключом.
Заметим, что это накладывает определенные ограничения на ключи, которые могут быть сертифицированы данным СА – в частности, для ключей Диффи-Хеллмана конечный участник может свободно выбрать параметры алгоритма – предполагая, что СА в случае необходимости может создать короткую (или одноразовую) пару ключей с соответствующими параметрами.
Данное обсуждение касается только САs, которые являются корневыми СА для некоторого конечного участника.
Основа описанной здесь процедуры состоит в том, что СА защищает свой новый открытый ключ, используя предыдущий закрытый ключ, и наоборот. Таким образом, если СА изменяет свою пару ключей, он должен создать два дополнительных значения атрибута сертификата cACertificate, если сертификаты доступны с использованием Х.500 директории (всего четыре сертификата: OldWithOld; OldWithNew; NewWithOld; NewWithNew).
Когда СА изменяет свою пару ключей, это влияет на тех участников, которые получили старый открытый ключ внешними способами. Они должны будут получить доступ к новому открытому ключу СА, защищенному с помощью старого закрытого ключа СА. Однако это будет возможно только в течение ограниченного периода времени (до тех пор, пока они не смогут получать новый открытый ключ СА с помощью внешнего механизма). Это обычно легко достигается, когда сертификаты конечных участников истекают.
Структурой данных, используемой для защиты нового и старого открытых ключей, является стандартный сертификат (который также может содержать расширения). Никаких новых структур данных не требуется.
Замечание 1: хотя схема и может охватывать случаи, когда СА изменяет свою пару ключей более одного раза в течение периода действительности хотя бы одного из сертификатов ЕЕ, данное правило может иметь неоднозначный результат. Отсутствие данного правила означает, что период действительности пары ключей СА должен быть больше, чем период действительности любого сертификата, выпущенного данным СА с использованием данной пары ключей.
Замечание 2: данная схема заставляет ЕЕ получать (внешними способами) новый открытый ключ СА по истечении срока действия последнего сертификата, с использованием которого был подписан старый закрытый ключ СА. Требуют ли этого операции
Для
Старый закрытый ключ СА более не требуется. Тем не менее старый открытый ключ еще некоторое время используется. Старый открытый ключ не будет требоваться, когда все конечные участники данного СА безопасно получат новый открытый ключ СА.
Сертификат "старый с новым" должен иметь период действительности, начинающийся с момента создания новой пары ключей и кончающейся временем, когда все конечные участники данного СА безопасно получат новый открытый ключ СА (самое позднее – это дата истечения срока действия старого открытого ключа).
Сертификат "новый с новым" должен иметь период действительности, начинающийся со времени создания новой пары ключей и заканчивающийся временем следующего изменения СА своей пары ключей.
Обычно при проверке подписи проверяющая сторона, помимо прочего, должна убедиться, что сертификат содержит открытый ключ подписавшего. Однако, поскольку допускается, что СА может изменить свой ключ, существует ряд новых возможностей, которые приведены в таблице 18.1.
| Репозиторий содержит новый и старый открытые ключи | Репозиторий содержит только старый открытый ключ (например, задержка опубликования) | |||
| Сертификат подписавшего защищен с использованием нового открытого ключа | Случай 1: Это стандартный случай, когда проверяющий может непосредственно проверить сертификат без использования директории |
Случай 3: В этом случае проверяющий должен иметь доступ к директории, чтобы получить значение нового открытого ключа |
Случай 5: Хотя оператор СА не изменил директорию, проверяющий может проверить сертификат непосредственно – аналогично случаю 1 |
Случай 7: В этом случае оператор СА не изменил директорию, и проверка не проходит |
| Сертификат подписавшего защищен с использованием старого открытого ключа | Случай 2: В этом случае проверяющий должен иметь доступ к директории, чтобы получить значение старого открытого ключа |
Случай 4: В этом случае проверяющий может непосредственно проверить сертификат без использования репозитория |
Случай 6: Проверяющий думает, что это ситуация случая 2 и хочет получить доступ к директории; однако проверка не проходит |
Случай 8: Хотя оператор СА не изменил директорию, проверяющий может проверить сертификат непосредственно – случай аналогичен случаю 4 |
В этих случаях проверяющий имеет локальную копию открытого ключа СА, которую можно непосредственно использовать для проверки сертификата. Это та же самая ситуация, когда изменения ключа не было.
Заметим, что случай 8 может возникнуть в промежуток времени, когда оператор СА создал новую пару ключей и сохранил в директории измененные атрибуты. Случай 5 может иметь место, если оператор СА выпустил как сертификат подписывающего, так и сертификат проверяющего в течение данного интервала (оператор СА должен избегать такой ситуации, т.к. это приводит к невозможности проверки, как описано выше).
В случае 2 проверяющий должен получить доступ к старому открытому ключу СА. Проверяющий делает следующее:
caCertificate в директории и получает OldWithNew- сертификат (определяемый на основе периода действительности);Случай 2 встречается, когда оператор СА выпустил сертификат подписывающего, затем изменил ключ и выпустил сертификат проверяющего; таким образом, это вполне типичный случай.
В случае 3 проверяющий должен получить доступ к новому открытому ключу СА. Проверяющий делает следующее:
саCertificate в директории и получает NewWithOld- сертификат (определяемый на основе периода действительности);Случай 3 имеет место, когда оператор СА выпускает сертификат проверяющего, затем изменяет ключ и выпускает сертификат подписавшего; таким образом, это вполне типичный случай.
В данном случае СА выпускает
Заметим, что невозможность проверки является ошибкой оператора СА.
В данном случае СА выпускает сертификат подписывающего, защищенный новым ключом, без изменения атрибутов директории. Это означает, что проверяющий не имеет способов получить достоверную версию нового ключа СА, поэтому проверка не проходит.
Заметим, что невозможность проверки также является ошибкой оператора.
Как показано выше, проверка сертификата становится более сложной, так как допускается
Анализ возможных альтернатив аналогичен проверке сертификата.
Запрашивающий СА является СА, который станет субъектом
Запрашивающий СА должен быть "up and running" до начала выполнения операции
Сущностью данной схемы
Данная схема соответствует ситуации, когда два САs могут проверить подписи друг друга (они имеют некоторые общие точки доверия) или предусмотрена внешняя проверка исходного запроса
Авторизационный код используется для обеспечения аутентификации и целостности. Это осуществляется путем создания симметричного ключа, основанного на авторизационном коде и с использованием симметричного ключа для создания МАСs для всех передаваемых сообщений.
Запрашивающий СА инициирует обмен созданием случайного числа (случайное число запрашивающего). Затем запрашивающий СА посылает отвечающему СА сообщение запроса ). Поля в данном сообщении защищены от модификации с помощью МАС, основанного на авторизационном коде.
При получении сообщения отвечающий СА проверяет версию протокола, сохраняет случайное число запрашивающего, создает свое случайное число (случайное число отвечающего) и проверяет МАС. Затем он создает (и, если требуется, архивирует) новый сертификат запрашивающего, который содержит открытый ключ запрашивающего СА и подписан закрытым ключом подписывания отвечающего СА. Отвечающий СА посылает сообщение ответа сср ). Поля в данном сообщении защищены от модификации с помощью МАС, основанного на авторизационном коде.
При получении срр сообщения запрашивающий СА должен убедиться, что его собственное системное время позднее системного времени отвечающего СА, проверяет полученные случайные числа и действительность МАС. Запрашивающий СА отвечает PKIConfirm -сообщением. Поля в данном сообщении защищены от модификации с использованием МАС, основанного на авторизационном коде. Запрашивающий СА записывает запрошенный сертификат в репозиторий.
При получении PKIConfirm -сообщения отвечающий СА проверяет случайные числа и действительность МАС.
Замечания:
Ccr сообщение должно содержать "завершенный" запрос сертификата, что означает, что все поля (включая расширения BasicConstraints ) должны быть указаны запрашивающим СА.Срр сообщение должно содержать сертификат проверки отвечающего СА – если он присутствует, то запрашивающий СА должен затем проверить данный сертификат (например, с помощью внешнего механизма).Инициализированный участник может в любое время запросить сертификат (как часть процедуры изменения для любой другой цели). Данный запрос будет сделан с использованием сообщения запроса сертификата ( cr ). Если конечный участник уже имеет пару ключей подписывания (с соответствующим сертификатом проверки), то данное cr сообщение обычно бывает защищено подписью участника. СА возвращает новый сертификат (если запрос успешен) в CertRepMessage.
Когда период действительности пары ключей истекает, соответствующий конечный участник может запросить изменение ключа – это означает, что он может сделать запрос на создание СА нового сертификата для новой пары ключей. Запрос может быть сделан с использованием сообщения kur ). Если конечный участник уже имеет пару ключей подписывания (с соответствующим сертификатом проверки), то данное сообщение обычно бывает защищено цифровой подписью участника. СА возвращает новый сертификат (если запрос успешен) в сообщении ответа изменения ключа ( kup ), которое синтаксически идентично CertRepMessage.
Рассмотрим структуры данных, необходимые для управляющих сообщений PKI. Далее опишем ограничения на значения и последовательность событий для каждой из управляющих операций PKI и рассмотрим, как это может быть инкапсулировано в различные транспортные механизмы.
Все сообщения, используемые для управления PKI, имеют следующую структуру:
PKIMessage ::= SEQUENCE {
header PKIHeader,
body PKIBody,
protection [0] PKIProtection OPTIONAL,
extraCerts [1] SEQUENCE SIZE (1..MAX) OF
Certificate OPTIONAL
}
PKIHeader содержит информацию, которая является общей для многих сообщений PKI.
PKIBody содержит информацию, специфичную для сообщения.
PKIProtection, если используется, содержит биты, которые защищают сообщение PKI.
Поле extraCerts может содержать сертификаты, которые могут использоваться получателем. Например, оно может применяться СА или RA для предоставления конечному участнику сертификатов, которые он должен проверить с использованием собственного нового сертификата (если, например, СА, который выпустил сертификат конечного участника, не является для него корневым СА). Заметим, что данное поле не обязательно должно содержать
Все 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,
-- идентифицирует транзакцию; должно быть
-- одним и тем же соответственно в
-- сообщениях запроса, ответа и
-- подтверждения
senderNonce [5] OCTET STRING OPTIONAL,
recipNonce [6] OCTET STRING OPTIONAL,
-- nonces, используемые для защиты от
-- replay-атак, senderNonce вставляется
-- создателем данного сообщения;
-- recipNonce является nonce, предвари-
-- тельно вставленным в соответствующее
-- сообщение ожидаемым получателем
-- данного сообщения
freeText [7] PKIFreeText OPTIONAL,
-- может быть использовано для указания
-- контекстно-зависимых инструкций
generalInfo [8] SEQUENCE SIZE (1..MAX) OF
InfoTypeAndValue OPTIONAL
-- может быть использовано для указания
-- контекстно-зависимой информации
}
PKIFreeText ::= SEQUENCE SIZE (1..MAX) OF
UTF8String
-- текст представлен как UTF-8 String
-- (замечание: каждый UTF8String должен
-- включать RFC 1766 language tag для
-- указания языка, на котором
-- представлен текст)
Поле pvno для данной версии спецификации фиксировано.
Поле sender содержит имя отправителя PKIMessage.
Данное имя (в сочетании с senderKID, если оно используется) должно применяться для проверки защиты сообщения. Если об отправителе ничего не известно (например, в сообщении начальной sender должно содержать значение NULL ; это означает, что последовательность RDN имеет нулевую длину. В таком случае поле senderKID должно содержать идентификатор (например, номер), указывающий получателю на информацию о соответствующем разделяемом секрете, который используется для проверки сообщения.
Поле recipient содержит имя получателя PKIMessage. Данное имя (в сочетании с recipKID, если он используется) должно применяться для проверки защиты сообщения.
Поле protectionAlg указывает алгоритм, используемый для защиты сообщения. Если биты защиты не применяются (заметим, что PKIProtection является OPTIONAL ), то данное поле должно быть опущено; если биты защиты применяются, то данное поле также должно использоваться.
SenderKID и recipKID используются для указания того, какие ключи были задействованы для защиты сообщения ( recipKID обычно требуется только в том случае, если для защиты сообщения используются ключи Диффи-Хеллмана).
Поле transactionID в заголовке сообщения может использоваться для того, чтобы допускать корреляцию с предыдущим запросом. Например, в случае с RA может существовать много отложенных на данный момент запросов.
Поля senderNonce и recipNonce защищают PKIMessage от
В поле messageTime указывается время создания сообщения. Это помогает конечным участникам корректировать свое локальное время в соответствии с временем центральной системы.
Поле freeText может использоваться для передачи получателю читаемого сообщения (на некотором языке). Первый язык используется для указания требуемого в ответе языка.
Поле generalInfo может применяться для передачи получателю дополнительных данных для машинной обработки.
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
}
Конкретные типы будут описаны ниже.
Сообщение запроса сертификата состоит из запроса сертификата, необязательного поля доказательства обладания и необязательного поля регистрационной информации.
CertReqMessages ::= SEQUENCE SIZE
(1..MAX) OF CertReqMsg
CertReqMsg ::= SEQUENCE {
certReq CertRequest,
pop ProofOfPossession OPTIONAL,
-- содержание зависит от типа ключа
regInfo SEQUENCE SIZE(1..MAX) of
AttributeTypeAndValue OPTIONAL }
Поле доказательства обладания используется для демонстрации того, что участник, указанный в сертификате, действительно знает соответствующий закрытый ключ. Это поле может быть вычислено над содержимым поля certReq и может варьироваться в зависимости от типов алгоритма открытого ключа и режима выполнения.
Поле regInfo должно содержать только дополнительную информацию, относящуюся к контексту запроса сертификата, когда такая информация требуется для выполнения запроса сертификата. Данная информация может включать контактную информацию подписчика, сведения о счете или другую служебную информацию, необходимую для выполнения запроса сертификата.
Информация, непосредственно относящаяся к содержимому сертификата, должна быть включена в содержимое certReq. Однако включение RAs дополнительного содержимого в certReq может привести к тому, что поле regInfo.
Некоторые PKI-сообщения могут быть защищены для обеспечения целостности. (Заметим, что если для защиты сообщения используется
При применении защиты используется следующая структура:
PKIProtection ::= BIT STRING
Входом для вычисления PKIProtection является
ProtectedPart ::= SEQUENCE {
header PKIHeader,
body PKIBody
}
Могут быть ситуации, когда PKIProtection сознательно не используется для защиты сообщения (т.е. это OPTIONAL поле опущено), т.к. применяется другая, внешняя по отношению к PKI, защита. Это явно допускается. Примерами такой внешней защиты являются PKIMessage (или просто PKIBody, если безопасность информации PKIHeader обеспечивается посредством внешних механизмов). Следует заметить, однако, что многие такие внешние механизмы требуют, чтобы конечный участник уже имел сертификат открытого ключа и/или DN и/или другую аналогичную относящуюся к инфраструктуре информацию. Таким образом, это может не соответствовать начальной PKIProtection -параметры. В будущем, если внешние механизмы будут модифицированы таким образом, чтобы соответствовать сценариям начальной загрузки, использование PKIProtection станет более редким или вовсе необязательным.
В зависимости от условий биты PKIProtection могут содержать МАС или подпись. Возможны следующие случаи:
В данном случае отправитель и получатель разделяют секретную информацию (установленную внешними способами или полученную из предыдущих операций PKI). PKIProtection будет содержать значение МАС и protectionAlg будет следующим:
PasswordBasedMac ::=
OBJECT IDENTIFIER
-- {1 2 840 113533 7 66 13}
PBMParameter ::= SEQUENCE {
salt OCTET STRING,
owf AlgorithmIdentifier,
-- AlgId для односторонней
-- функции OWF
-- (рекомендуется SHA-1)
iterationCount INTEGER,
-- количество применений OWF
mac AlgorithmIdentifier
-- AlgId MAC (например,
-- DES-MAC, Triple-DES-MAC,
-- или HMAC)
}
В указанном выше protectionAlg значение присоединяется к разделяемому секрету. Затем применяется iterationCount раз, где секрет с добавлением является входом в первую итерацию и вход каждой итерации является выходом предыдущей. Выход последней итерации (называемый BASEKEY ) используется для создания симметричного ключа. Если алгоритм МАС требует K -битного ключа и K < H, то используются младшие K бит BASEKEY. Если K > H, то весь BASEKEY используется для младших Н битов ключа, ) применяется для следующих Н битов ключа и т.д.
Когда отправитель и получатель имеют сертификаты Диффи-Хеллмана с совместимыми параметрами, для защиты сообщения конечный участник должен создать симметричный ключ, основываясь на значении своего закрытого ключа DH и открытом ключе DH получателя PKI-сообщения.
PKIProtection будет содержать значение МАС с ключом, полученным из симметричного ключа и protectionAlg следующим образом:
DHBasedMac ::= OBJECT IDENTIFIER
-- {1 2 840 113533 7 66 30}
DHBMParameter ::= SEQUENCE {
owf AlgorithmIdentifier,
-- AlgId для односторонней
-- функции (OWF)
-- (рекомендуется SHA-1)
mac AlgorithmIdentifier
-- the MAC AlgId (например,
-- DES-MAC,
-- Triple-DES-MAC или НМАС)
}
protectionAlg применяется к результату вычислений DH. Выход (называемый BASEKEY ) используется для формирования симметричного ключа. Если алгоритм МАС требует K -битного ключа и K < H, то используются K младших битов BASEKEY. Если K > H, то используется весь BASEKEY для младших Н битов ключа, применяется для следующих младших Н битов ключа и т.д.
Если отправитель имеет пару ключей подписывания, он может просто подписать PKI-сообщение. PKIProtection будет содержать значение подписи, protectionAlg будет определяться значением AlgorithnIdentifier.
В случае, когда конечный участник отправляет защищенное PKI-сообщение RA, RA может перенаправить данное сообщение СА, присоединив свою собственную защиту (которая может быть МАС или цифровой подписью, в зависимости от информации и сертификатов, разделяемых RA и СА). Это предполагает вложение всего сообщения, посылаемого конечным участником, в новое PKI-сообщение. Используется следующая структура.
NestedMessageContent ::= PKIMessage
Перед тем как указывать типы, которые могут быть размещены в PKIBody, мы определим некоторые структуры данных, которые могут применяться.
Различные управляющие сообщения PKI требуют, чтобы инициатор сообщения указал некоторые поля, которые должны присутствовать в сертификате. Структура CertTemplate позволяет конечному участнику или RA указать как можно больше того, что должен содержать сертификат. CertTemplate аналогична Certificate, но все поля являются необязательными.
Заметим, что даже если инициатор полностью указал требуемое содержимое сертификата, СА имеет право модифицировать поля в сертификате, который он реально издает. Если модифицированный сертификат для запрашивающего неприемлем, можно задержать Confirmation -сообщение или послать Error -сообщение (с PKIStatus "rejection" ).
Когда в PKI сообщениях присутствуют зашифрованные значения (это могут быть либо закрытые ключи, либо сертификаты), используется структура данных EncryptedValue.
Применение этой структуры данных предполагает, что создатель и ожидаемый получатель имеют возможность соответственно зашифровать и расшифровать данные. Обычно это означает, что отправитель и получатель имеют или могут создать разделяемый секретный ключ.
Если получатель PKIMessage уже имеет закрытый ключ, используемый для дешифрования, поле encSymmKey может содержать
Все сообщения ответа включают определенную информацию о статусе. Определены следующие значения:
PKIStatus ::= INTEGER {
Granted (0),
-- получено то, что запрашивалось
grantedWithMods (1),
-- получено что-то подобное, что запрашивалось;
-- запрашивающий несет ответственность за
-- установленные отличия
rejection (2),
-- не получено то, что запрашивалось,
-- более подробная информация в сообщении
waiting (3),
-- запрос не обработан,
-- следует запросить позднее
revocationWarning (4),
-- данное сообщение содержит предупреждение,
-- что скоро будет отмена
revocationNotification (5),
-- уведомление, что произошла отмена
keyUpdateWarning (6)
-- изменение уже выполнено для oldCertId,
-- указанного в сообщении запроса изменения ключа
}
Отвечающий может использовать следующий синтаксис для предоставления более подробной информации о причинах неудачи.
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
}
Для идентификации конкретных сертификатов используется структура данных CertId.
Каждый корневой СА должен иметь возможность опубликовать свой текущий открытый ключ посредством некоторых "внешних" механизмов. Хотя такие механизмы находятся вне рассматриваемой предметной области, мы определим структуры данных, которые могут ими поддерживаться.
Доступны два общих метода: либо СА непосредственно публикует свой самоподписанный сертификат, либо данная информация доступна через Директорию (или ее эквивалент) и СА публикует хэш данного значения, позволяя тем самым перед использованием проверить целостность его сертификата.
OOBCert ::= Certificate
Поля в данном сертификате имеют следующие ограничения:
SubjectPublicKeyInfo );subject и issuer должны быть идентичны;subject является NULL, то оба расширения, subjectAltName и issuerAltName, должны присутствовать и иметь одно и то же значение;subject и issuer должны быть одни и те же).OOBCertHash ::= SEQUENCE {
hashAlg [0] AlgorithmIdentifier
OPTIONAL,
certId [1] CertId OPTIONAL,
hashVal BIT STRING
-- hashVal вычисляется для
-- самоподписанного
-- сертификата с идентификатором
-- certID.}
Смысл значения хэша состоит в том, чтобы любой, кто безопасно получил значение хэша (внешними способами), мог проверить самоподписанный сертификат данного СА.
Запрашивающий может указать, что он хочет архивировать значение закрытого ключа, используя структуру PKIArchiveOptions.
Запрашивающий может указать, что он хочет, чтобы PKI опубликовал сертификат, используя структуру PKIPublicationInfo.
Если запрос сертификата предназначен для пары ключей подписывания (т.е. запрос для верифицирующего сертификата), то доказательство обладания закрытым ключом подписывания демонстрируется с помощью структуры POPOSingingKey.
POPOSigningKeyInput ::= SEQUENCE {
authInfo CHOICE {
sender [0] GeneralName,
-- из PKIHeader (используется только в
-- том случае, если аутентифицированная
-- идентификация установлена
-- отправителем (например, DN из ранее
-- выпущенного и действительного
-- в данный момент сертификата))
publicKeyMAC [1] PKMACValue
-- используется, если в настоящий момент
-- не существует аутентифицированного
-- GeneralName для отправителя;
-- publicKeyMAC содержит основанный на
-- пароле MAC (используя protectionAlg
-- AlgId из PKIHeader) для
-- DER-представления publicKey
},
publicKey SubjectPublicKeyInfo
-- из CertTemplate
}
С другой стороны, если запрос сертификата выполнен для пары ключей шифрования (например, запрос для сертификата шифрования), то доказательство обладания закрытым ключом дешифрования может быть продемонстрировано одним из трех способов.
CertRequest (в управляющей структуре PKIArchiveOptions ).PKIConirm, используя ключ, полученный из данного симметричного ключа. Заметим, что если более одного CertReqMsg включено в PKIMessage, то СА использует разные симметричные ключи для каждого CertReqMsg, и МАС задействует ключ, полученный из конкатенации всех этих ключей. Процедура вычисления МАС использует PasswordBasedMacAlgId, определенный выше.POPODecKeyChall и POPODecKeyResp, см ниже) между CertReqMessages и CertRepMessages. Это "прямой" метод, как он определен выше. Данный метод обычно используется в окружении, в котором RA проверяет req’ не обязательно должно инкапсулировать req в качестве вложенного сообщения):Очевидно, что данный протокол является более длинным, но позволяет включать локальный RA, при этом сам сертификат реально не создается, пока не приведено доказательство обладания.
Если запрос сертификата выполнен для пары ключей согласования ключа (Key Agreement Key – KAK), то
Challenge используется PreferredSymmAlg и симметричный ключ, полученный из закрытого KAK СА и открытого ключа, для которого выполнен запрос сертификата. В качестве альтернативы POPOSigningKey, где поле alg есть DHBasedMAC и поле подписи есть МАС, в качестве четвертой альтернативы для демонстрации Сообщения вызова-ответа для доказательства обладания закрытым ключом шифрования определены следующим образом. Заметим, что обмен вызов-ответ связан с сообщением запроса сертификата (и тем самым с сообщениями ответа сертификата и подтверждением) с помощью , используемых в PKIHeader, и защитой (МАС или подписыванием), примененной к PKIMessage.
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.2) Полный протокол доказательства обладания закрытым ключем
Сообщение запроса инициализации содержит в PKIBody структуру данных CertReqMessage, которая описывает запрашиваемые сертификаты. Обычно SubjectPubKeyInfo, KeyId и Validity являются шаблонными полями, которые заменяются для каждого затребованного сертификата. Считается, что данное сообщение используется для первой инициализации участника в PKI.
Сообщение ответа инициализации в PKIBody структуру данных CertRepMessage, которая для каждого запрошенного сертификата имеет поле PKIStatusInfo, сертификат субъекта и, возможно, закрытый ключ (обычно зашифрованный protocolEncKey ).
Далее приводится синтаксис CertRepMessage. Заметим, что если защитой сообщения PKI является "разделяемая секретная информация", то любой сертификат, передаваемый в поле caPubs, может быть непосредственно доверенным как сертификат корневого СА инициатора.
Сообщение запроса PKIBody структуру данных CertReqMessages, которая специфицирует запрошенные сертификаты. Считается, что данное сообщение используется для существующих в PKI участников, которые хотят получить дополнительные сертификаты.
В качестве альтернативы PKIBody может применяться CertificationRequest. Данная структура может требоваться для пары ключей подписывания, когда необходимо взаимодействие с наследуемыми системами.
Сообщение ответа PKIBody структуру данных CertRepMessage, которая указывает значение статуса для каждого запрошенного сертификата, и дополнительно открытый ключ СА, информацию о неудаче, сертификат субъекта и закрытый зашифрованный ключ.
CertRepMessage ::= SEQUENCE {
CaPubs [1] SEQUENCE SIZE (1..MAX)
OF Certificate OPTIONAL,
Response SEQUENCE OF CertResponse }
CertResponse ::= SEQUENCE {
CertReqId INTEGER,
-- для установления соответствия между
-- ответом и запросом – 1 используется,
-- если certReqId в соответствующем
-- запросе не указан)
status PKIStatusInfo,
certifiedKeyPair CertifiedKeyPair
OPTIONAL,
rspInfo OCTET STRING OPTIONAL
-- аналогично id-regInfo-asciiPairs
-- OCTET STRING,
-- определенной для regInfo
-- в CertReqMsg
}
CertifiedKeyPair ::= SEQUENCE {
certOrEncCert CertOrEncCert,
privateKey [0] EncryptedValue OPTIONAL,
publicationInfo [1] PKIPublicationInfo
OPTIONAL
}
CertOrEncCert ::= CHOICE {
certificate [0] Certificate,
encryptedCert [1] EncryptedValue
}
Только одно из полей failInfo (в PKIStatusInfo ) и certificate (в CertifiedKeyPair ) может быть представлено в каждом CertResponse (в зависимости от статуса). Для некоторых значений статуса (например, waiting ) ни одно из дополнительных полей присутствовать не может.
Сертификат может быть получен при наличии EncryptedCert и соответствующего ключа дешифрования. Это делается для того, чтобы позволить СА возвращать значение сертификата, но с тем ограничением, что только определенный получатель может получить настоящий сертификат. Преимущество данного подхода состоит в том, что СА может возвращать сертификат даже при отсутствии доказательства, что запрашивающий является конечным участником, который может использовать соответствующий закрытый ключ (заметим, что доказательство не представлено до тех пор, пока СА не получит PKIConfirm -сообщение). Таким образом, СА не будет отменять сертификат до тех пор, пока не получит неправильное доказательство обладания.
Для CertReqMessages. Обычно SubjectPublicKeyInfo, KeyId и Validity являются шаблонными полями, которые заполняются для каждого изменяемого ключа. Считается, что данное сообщение применяется для
Для ответов об изменении ключа используется синтаксис CertRepMessage. Ответ идентичен ответу инициализации.
Синтаксис CertRepMessage описан выше.
Для запросов восстановления ключа используется синтаксис, идентичный запросу инициализации CertReqMesages. Обычно SubjectPublicKeyInfo и KeyId являются шаблонными полями, которые могут применяться для указания открытого ключа подписи, для которого был запрошен сертификат.
Для ответов восстановления ключа используется следующий синтаксис. Для некоторых значений статуса (например, waiting ) могут присутствовать дополнительные поля.
KeyRecRepContent ::= SEQUENCE { status
PKIStatusInfo,
newSigCert [0] Certificate OPTIONAL,
caCerts [1] SEQUENCE SIZE (1..MAX) OF
Certificate OPTIONAL,
keyPairHist [2] SEQUENCE SIZE (1..MAX) OF
CertifiedKeyPair OPTIONAL
}
При запросе отмены сертификата (или нескольких сертификатов) используется следующая структура данных. Имя запрашивающего присутствует в PKIHeader -структуре.
RevReqContent ::= SEQUENCE OF RevDetails
RevDetails ::= SEQUENCE {
certDetails CertTemplate,
-- позволяет запрашивающему указать
-- как можно больше
-- сведений о сертификате,
-- для которого требуется отмена
-- (например, для случаев, когда
-- serialNumber недоступен)
revocationReason ReasonFlags OPTIONAL,
-- причина запроса отмены
badSinceDate GeneralizedTime OPTIONAL,
-- указывает максимальные знания
-- отправителя
crlEntryDetails Extensions OPTIONAL
-- запрошенные crlEntryExtensions
}
Ответ на предыдущее сообщение. Если отмена произведена, то данное сообщение посылается запрашивающему. Отдельное уведомление об отмене может быть послано
RevRepContent ::= SEQUENCE {
status SEQUENCE SIZE (1..MAX)
OF PKIStatusInfo,
-- в той же последовательности,
-- как было послано в RevReqContent
revCerts [0] SEQUENCE SIZE
(1..MAX) OF CertId OPTIONAL,
-- Ids, для которых запрошена отмена
-- (тот же порядок, что и status)
crls [1] SEQUENCE SIZE (1..MAX)
OF CertificateList OPTIONAL
-- результирующие CRLs (может
-- быть более одного)
}
Запросы CertReqMessages ), что и обычные запросы
Ответы CertRepMessages ), что и для обычных ответов
Когда СА изменяет собственную пару ключей, для оповещения может использоваться следующая структура данных.
CAKeyUpdAnnContent ::= SEQUENCE {
OldWithNew Certificate,
-- старый pub, подписанный новым priv
NewWithOld Certificate,
-- новый pub, подписанный старым priv
NewWithNew Certificate
-- новый pub, подписанный новым priv
}
Данная структура может использоваться для оповещения о существовании сертификатов.
Считается, что данное сообщение будет использоваться в тех ситуациях (если они возникнут), когда не существует методов для опубликования сертификатов; не считается, что она будет использоваться, например, в том случае, если для опубликования сертификатов используется директория.
CertAnnContent ::= Certificate
При выполнении СА отмены или предположении отмены может быть выпущен специальный сертификат для оповещения об этом событии.
RevAnnContent ::= SEQUENCE {
status PKIStatus,
certId CertId,
willBeRevokedAt GeneralizedTime,
badSinceDate GeneralizedTime,
crlDetails Extensions OPTIONAL
-- детали extra CRL (например,
-- crl number, reason, location, etc.)
}
СА может использовать такое оповещение для уведомления субъекта о том, что его сертификат отменен или его предполагается отменить. Это обычно используется в тех случаях, когда запрос отмены приходит не от того субъекта, которого он касается.
Поле willBeRevokedAt содержит время, когда новая запись будет добавлена в соответствующие CRLs.
Когда СА выпускает новый CRL (или множество CRLs), для оповещения о данном событии может использоваться следующая структура данных.
CRLAnnContent ::= SEQUENCE OF CertificateList
Данная структура данных используется при трехстороннем протоколе в качестве заключительного PKIMessage. Его содержимое является одним и тем же во всех случаях – на самом деле оно не имеет содержимого, т.к. PKIHeader уже содержит всю необходимую информацию.
PKIConfirmContent ::= NULL
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 может послать всю/любую
-- интересующую информацию.
GenRepContent ::= SEQUENCE OF InfoTypeAndValue -- Получатель может игнорировать -- любое содержимое -- OBJ.IDs, которое он не распознает.
ErrorMsgContent ::= SEQUENCE {
pKIStatusInfo PKIStatusInfo,
errorCode INTEGER OPTIONAL,
-- конкретные для реализации
-- коды ошибок
errorDetails PKIFreeText OPTIONAL
-- конкретные для реализации
-- детали ошибок }
Синтаксис 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
}
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 обязан выполнить обмен
-- вызов-ответ с конечным участником, чтобы доказать,
-- что ему известен закрытый ключ
}
Считается, что протоколы должны включать подтверждающее сообщение для сообщения вызов-ответ.
Следующий алгоритм должен применяться при использовании 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 и конечным участником. Значение присоединяется к разделяемому секрету, и односторонняя функция ( ) применяется iterationCount раз, где секрет и являются входом в первую итерацию, и для каждой следующей итерации вход есть множество выходов предыдущей итерации, включая ключ 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
Альтернативой посылки ключа является посылка информации о том, как заново создать ключ, используя выбор KeyGenParameters (например, для многих реализаций RSA можно послать первое случайное простое число).
Рассматриваемая схема является минимальной схемой для поддержки PKI для протокола LDAPv2. Определим только компоненты, относящиеся к PKI. LDAP-серверы, функционирующие как репозитории PKI, должны поддерживать вспомогательные классы объектов и соответствующим образом интегрировать спецификацию данной схемы с общей схемой и другими схемами, специфичными для других приложений.
LDAPv2 является одним из протоколов для доступа к репозиторию PKI. Также определены другие протоколы, такие как HTTP. Если LDAP-сервер, доступный по LDAPv2, используется в качестве репозитория, минимальное требование состоит в том, что репозиторий должен поддерживать дополнительные записи каталога для сертификатов Х.509.
Определим атрибуты и классы объектов, используемые LDAP-серверами, функционирующими в качестве репозиториев PKI, которые должны понимать клиенты LDAP, взаимодействующие с этими репозиториями для
Объектами, представленными в репозитории, являются:
Следующий вспомогательный класс объекта может использоваться для представления
pkiUser OBJECT-CLASS ::= {
SUBCLASS OF { top}
KIND auxiliary
MAY CONTAIN {userCertificate}
ID joint-iso-ccitt(2) ds(5)
objectClass(6) pkiUser(21)
}
userCertificate ATTRIBUTE ::= {
WITH SYNTAX Certificate
EQUALITY MATCHING RULE
certificateExactMatch
ID joint-iso-ccitt(2) ds(5)
attributeType(4)
userCertificate(36)
}
Конечный участник может получить один или более сертификатов от одного или более СAs. Атрибут userCertificate должен использоваться для представления этих сертификатов в записи каталога , относящейся к данному пользователю.
Следующий вспомогательный класс объекта может применяться для представления
pkiCA OBJECT-CLASS ::= {
SUBCLASS OF { top}
KIND auxiliary
MAY CONTAIN {cACertificate |
certificateRevocationList |
authorityRevocationList |
crossCertificatePair }
ID joint-iso-ccitt(2) ds(5)
objectClass(6) pkiCA(22)
}
cACertificate ATTRIBUTE ::= {
WITH SYNTAX Certificate
EQUALITY MATCHING RULE
certificateExactMatch
ID joint-iso-ccitt(2) ds(5)
attributeType(4)
cACertificate(37)
}
crossCertificatePairATTRIBUTE::={
WITH SYNTAX CertificatePair
EQUALITY MATCHING RULE
certificatePairExactMatch
ID joint-iso-ccitt(2) ds(5)
attributeType(4)
crossCertificatePair(40)
}
Атрибут cACertificate записи каталога СА должен использоваться для хранения
Forward -элементы crossCertificatePair -reverse элементы crossCertificatePair -forward и reverse, в значении одного атрибута, имя выпускающего в одном сертификате должно соответствовать имени субъекта в другом и наоборот, и открытый ключ субъекта в одном сертификате должен иметь возможность проверять подпись в другом сертификате и наоборот.
Если присутствует элемент reverse, значение forward -элемента и значение reverse -элемента не обязательно должны являться значениями одного о того же атрибута; другими словами они могут являться значениями как одного атрибута, так и значениями двух атрибутов.
В случае v3 сертификатов ни один из перечисленных выше сертификатов не должен включать расширение basicConstraints со значением сА, установленным в FALSE.
Определение области относится исключительно к локальной политике.
certificateRevocationListATTRIBUTE::={
WITH SYNTAX CertificateList
EQUALITY MATCHING RULE
certificateListExactMatch
ID joint-iso-ccitt(2) ds(5)
attributeType(4)
certificateRevocationList(39)
}
Атрибут certificateRevocationList, если присутствует в конкретной записи СА, содержит CRL(s).
authorityRevocationListATTRIBUTE::={
WITH SYNTAX CertificateList
EQUALITY MATCHING RULE
certificateListExactMatch
ID joint-iso-ccitt(2) ds(5)
attributeType(4)
authorityRevocationList(38)
}
Атрибут authorityRevocationList, если присутствует в конкретной записи СА, содержит информацию об отмене, относящуюся к сертификатам, выпущенным для других САs.
Точки распространения CRL являются дополнительным механизмом, который может использоваться для распространения информации об отмене.
Если СА решает задействовать точки распространения CRL, для этого используется следующий класс объектов.
cRLDistributionPoint OBJECT-CLASS::= {
SUBCLASS OF { top }
KIND structural
MUST CONTAIN { commonName }
MAY CONTAIN {
certificateRevocationList |
authorityRevocationList |
deltaRevocationList }
ID joint-iso-ccitt(2) ds(5)
objectClass(6)
cRLDistributionPoint(19) }
Атрибуты certificateRevocationList и authorityRevocationList определены выше.
Атрибут commonName и атрибуты deltaRevocationList, определенные в Х.509, продублированы ниже.
commonName ATTRIBUTE::={
SUBTYPE OF name
WITH SYNTAX DirectoryString
ID joint-iso-ccitt(2) ds(5)
attributeType(4)
commonName(3)
}
deltaRevocationList ATTRIBUTE ::= {
WITH SYNTAX CertificateList
EQUALITY MATCHING RULE
certificateListExactMatch
ID joint-iso-ccitt(2) ds(5)
attributeType(4)
deltaRevocationList(53) }
Если СА выбирает использование
deltaCRL OBJECT-CLASS ::= {
SUBCLASS OF { top }
KIND auxiliary
MAY CONTAIN { deltaRevocationList }
ID joint-iso-ccitt(2) ds(5)
objectClass(6) deltaCRL(23)
}
Транспортные протоколы, описанные ниже, позволяют конечным участникам, RAs и CАs передавать друг другу PKI-сообщения. Не существует требований относительно применения конкретных механизмов безопасности на данном уровне, если сообщения PKI соответствующем образом защищены (это так, если используется OPTIONAL PKIProtection параметр, как определено для каждого сообщения).
Файл, содержащий сообщение PKI, должен содержать только
Такие файлы могут применяться для передачи PKI-сообщений, с помощью, например, FTP.
Используется следующий простой протокол, основанный на ТСР, для передачи PKI-сообщений. Данный протокол соответствует случаям, когда конечный участник (или RA) инициирует транзакцию и может принимать результаты.
Если транзакция инициируется PKI-участником (RA или СА), то конечный участник должен либо задействовать listener-процесс, либо иметь соответствующую ссылку, которая позволяет получать PKI-сообщения от компонента управления PKI.
Протокол предполагает существование listener-процесса на RA или СА, который может принимать PKI-сообщения на определенный порт (номер порта 829). Обычно инициатор связывается с данным портом и передает начальное PKI-сообщение для данного ID транзакции. Отвечающий передает PKI-сообщение и/или номер ссылки, который будет использоваться позднее для получения реального PKI- сообщения ответа.
Если на данный запрос получено несколько PKI-сообщений ответа (возможно, если некоторая часть запроса обрабатывается быстрее, чем остальные), то также возвращается новая ссылка.
Когда инициатором получено заключительное PKI-сообщение ответа, новая ссылка не используется.
Инициатор транзакции посылает получателю <<direct TCP-based PKI message>>. Получатель отвечает аналогичным сообщением.
<<direct TCP-based PKI message>> состоит из:
length (32 бита), flag (8 бит), value
Данный раздел описывает способы для пересылки сообщений в представлении ASN.1 для обменов, рассмотренных в предыдущем разделе, с помощью e-mail.
Простой MIME объект определяется следующим образом.
Content-Type: application/pkixcmp Content-Transfer-Encoding: base64 <<the ASN.1 DER-encoded PKIX-CMP message, base64-encoded>>
Данный объект MIME может быть послан или получен с использованием общего MIME, предоставляя простой почтовый транспорт для PKIX-CMP сообщений. Реализации могут также распознавать и задействовать MIME-тип application/x-pkixcmp (определенный в более ранних версиях), чтобы обеспечить обратную совместимость.
Данный подраздел описывает способы для пересылки сообщений в ASN.1 представлении для обменов, описанных в предыдущем разделе, с помощью НТТР.
Простой MIME объект описывается следующим образом.
Content-Type: application/pkixcmp
<<the ASN.1 DER-encoded
PKIX-CMP message>>
Данный MIME-объект может быть послан или получен с использованием НТТР, используя простой браузер-ориентированный транспорт для PKIX-CMP сообщений. Реализации могут также распознавать и использовать тип MIME application/x-pkixcmp (определенный в более ранних версиях), для обеспечения обратной совместимости.
Данный протокол предназначен для предоставления доступа к репозиториям PKI для получения информации и управления этой информацией. Протокол основан на LDAP v2, определенном в RFC 1777.
Рассмотрим требования для получения информации PKI X.509 из репозитория, включая сертификаты и CRLs.
Конечные участники и САs, используя подмножество протокола LDAPv2, получают информацию PKI из репозитория.
САs помещает информацию PKI в репозиторий, также используя подмножество протокола LDAPv2.
Рассмотрим получение информации PKI из репозитория и управление информацией PKI в нем. Опишем профиль протокола LDAPv2 для выполнения этих функций.
Приведем требования для получения информации PKI (сертификат, CRL или другая представляющая интерес информация) из записи в репозитории, когда данная запись (либо конечного участника, либо СА) имеет известное имя. При этом используется термин "чтение репозитория".
Рассмотрим требования, когда имя записи неизвестно, но может использоваться некоторая другая информация для фильтрации записей в репозитории. При этом используется термин "поиск в репозитории".
Рассмотрим требования для САs для добавления, удаления и модификации информации PKI (сертификат, CRL или другая представляющая интерес информация) в репозитории. При этом используется термин "модификация репозитория".
Далее описано подмножество LDAPv2 поддержки каждой из этих функций. Заметим, что сервис поиска в репозитории является более общим относительно сервиса чтения репозитория в терминах функциональности LDAPv2.
Для получения информации из записи, соответствующей имени субъекта или выпускающего сертификата, требуется подмножество из следующих трех операций LDAP:
BindRequest (и BindResponse) SearchRequest (и SearchResponse) UnbindRequest
Приложение, предоставляющее LDAP сервис чтения репозитория, должно реализовать следующее подмножество данной операции:
BindRequest ::= [APPLICATION 0] SEQUENCE {
version INTEGER (2),
name LDAPDN,
-- должен приниматься NULL LDAPDN
simpleauth [0] OCTET STRING
-- должен приниматься NULL simple }
Приложение, предоставляющее сервис чтения репозитория, может также реализовать другие возможности BindRequest.
Разные сервисы могут иметь различные требования безопасности. Одни сервисы могут допускать анонимный поиск, другие могут требовать аутентификации. Сервисы, допускающие анонимный поиск, могут разрешать поиск только на основе общего критерия.
Предполагается, что сервис чтения репозитория должен реализовывать некоторый уровень анонимного доступа к поиску. Сервис чтения репозитория может реализовывать аутентифицированный доступ к поиску.
Приложение, предоставляющее сервис чтения репозитория, должно полностью реализовать данный элемент протокола, при этом могут возвращаться только следующие коды ошибок при выполнении операции Bind:
success (0), operationsError (1), protocolError (2), authMethodNotSupported (7), noSuchObject (32), invalidDNSyntax (34), inappropriateAuthentication (48), invalidCredentials (49), busy (51), unavailable (52), unwillingToPerform (53), other (80)
Приложение, предоставляющее LDAP сервис чтения репозитория, должно реализовывать следующее подмножество SearchRequest:
SearchRequest ::= [APPLICATION 3] SEQUENCE {
baseObject LDAPDN,
scope ENUMERATED {baseObject (0), },
derefAliases ENUMERATED {
neverDerefAliases (0),
},
sizeLimit INTEGER (0),
timeLimit INTEGER (0),
attrsOnly BOOLEAN, -- FALSE only
filter Filter,
attributes SEQUENCE OF AttributeType
}
Filter ::= CHOICE {
present [7] AttributeType,
-- только "objectСlass"
}
Данное подмножество LDAPv2 SearchRequest обеспечивает операцию " read " LDAPv2: поиск объекта с использованием фильтра для проверки существования атрибута objectClass.
Приложение, предоставляющее сервис чтения репозитория, может также реализовать другие возможности SearchRequest.
Приложение, предоставляющее LDAP сервис поиска в репозитории, должно полностью реализовать SearchResponse.
Заметим, что в том случае, когда атрибут имеет несколько значений, например, userCertificate, SearchResponse содержит все значения, предполагая, что запрашивающий имеет достаточно прав доступа. У приложения или доверяющей группы может возникнуть необходимость выбрать для использования соответствующее значение. Заметим также, что получение сертификата из именованной записи не гарантирует, что сертификат будет включать то же самое DN, и в некоторых случаях subjectDN в сертификате может быть NULL.
Для поиска в репозитории записи, содержащей сертификат, CRL или другую интересующую информацию, с использованием произвольного критерия, необходимо подмножество следующих трех операций LDAP:
BindRequest (и BindResponse), SearchRequest (и SearchResponse) UnbindRequest
Далее приведено требуемое подмножество для каждой операции.
Приложение, предоставляющее сервис поиска в репозитории LDAP, должно реализовать следующее подмножество протокола SearchRequest.
SearchRequest ::= [APPLICATION 3] SEQUENCE {
baseObject LDAPDN,
scope ENUMERATED {
baseObject (0),
singleLevel (1),
wholeSubtree (2)
},
derefAliases ENUMERATED {
neverDerefAliases (0),
},
sizeLimit INTEGER (0 .. maxInt),
timeLimit INTEGER (0 .. maxInt),
attrsOnly BOOLEAN, -- FALSE only
filter Filter,
attributes SEQUENCE OF
AttributeType
}
Должны поддерживаться все аспекты SearchRequest, за исключением следующего:
neverDeferAliases для deferAliases.FALSE для attrsOnly.Данное подмножество предоставляет более общие возможности поиска. Это надмножество подмножества SearchRequest, определенного выше. Элементами, добавляемыми в данный сервис, являются:
singleLevel и wholeSubtree.sizeLimit.timeLimit.Приложение, предоставляющее сервис поиска в репозитории LDAP, может также реализовывать и другие аспекты SearchRequest.
Для добавления, удаления и модификации PKI информации в репозитории требуется подмножество следующих операций LDAP:
BindRequest (и BindResponse), ModifyRequest (и ModifyResponse), AddRequest (и AddResponse) DelRequest (и DelResponse), UnbindRequest
Далее определяется требуемое подмножество для каждой операции.
Приложение, предоставляющее сервис модификации репозитория LDAP, должно реализовывать следующее подмножество операций:
BindRequest ::= [APPLICATION 0] SEQUENCE {
version INTEGER (2),
name LDAPDN,
simpleauth [0] OCTET STRING }
Сервис модификации репозитория LDAP должен реализовывать аутентифицированный доступ.
Необходимые подмножества BindResponse являются теми же, что были описаны выше.
Приложение, предоставляющее сервис модификации в репозитории LDAP, должно реализовывать следующее подмножество протокола ModifyRequest.
ModifyRequest ::= [APPLICATION 6] SEQUENCE {
object LDAPDN,
modification SEQUENCE OF SEQUENCE {
operation ENUMERATED {
add (0),
delete (1)
},
modification SEQUENCE {
type AttributeType,
values SET OF
AttributeValue
}
}
}
Необходимо поддерживать только значения add и delete для ModifyRequest.
В этой лекции будут рассматриваться управляющие протоколы PKI.
Сначала мы сделаем общий обзор проблем в области
PKI должна быть организована таким образом, чтобы быть согласованной с различными типами администрирования. Предоставление администраторам альтернатив в использовании не связанных между собой функциональных возможностей не только ведет к усложнению ПО, но и увеличивает вероятность того, что незначительная ошибка администратора или разработчика ПО приведет к большим проблемам, связанным с безопасностью. Аналогично, ограничение администраторов громоздкими механизмами приведет к тому, что они не будут использовать PKI.
Все конечные участники требуют локального безопасного доступа к некоторой информации – как минимум к своему собственному имени и закрытому ключу, имени СА, который является доверенным для данного участника, и открытому ключу СА (или дайджесту открытого ключа, если допустима самосертифицированная версия). Может использоваться локальное безопасное хранение и для большего количества информации (например, сертификата конечного участника или информации, относящейся к приложению). Форма хранения также может быть различной – от файлов до неподделываемых криптографических токенов. Такое локальное доверенное хранение мы будем определять как персональное безопасное окружение (Personal Security Environment –
Хотя форматы
Рассматриваемые протоколы должны удовлетворять следующим требованиям к управлению PKI.
PKIConfirm -сообщения).Множество операций, для которых определены управляющие сообщения, могут быть сгруппированы следующим образом.
subject CA и issuer CA различны, и SubjectPublicKeyInfo содержит ключ проверки (например, сертификат выпущен для пары ключей подписывания subject CA). Когда необходимо более тонкое различие, могут использоваться следующие термины: subject и issuer CA принадлежат различным административным доменам; в противном случае он называется внутридоменным Замечание 1. Во многих окружениях термин
Замечание 2. Выпуск
Заметим, что on-line протоколы являются не единственным способом реализации перечисленных выше операций. Для всех операций существуют off-line методы, с помощью которых можно добиться того же самого результата, и в принципе никто не требует задействовать исключительно on-line протоколы. Например, если используется аппаратный токен, многие операции могут быть получены как часть физической доставки токена.
Далее определим множество стандартных сообщений, поддерживающих перечисленные выше операции. Также определим протоколы для доставки этих сообщений в различных окружениях (на основе различных протоколов).
Первым действием конечного участника является запрос информации о поддерживаемых функциях PKI и безопасное получение открытого ключа (ключей) соответствующего корневого СА.
Существует много схем, которые могут использоваться для обеспечения начальной
Однако можно классифицировать схемы начальной
Составив классификацию схем, мы определим некоторые из них как обязательные и некоторые – как дополнительные. Обязательные схемы должны охватывать достаточное количество реальных случаев, в то время как дополнительные схемы применяются в исключительных случаях, которые возникают реже. Таким образом можно добиться баланса между гибкостью и легкостью реализации.
Рассмотрим классификацию схем начальной
Пользуясь терминами создаваемых сообщений PKI, можно сказать, что инициализация начальных обменов
On-line сообщения, созданные конечным участником, запрашивающим сертификат, могут быть как аутентифицированы, так и нет. Требованием является аутентификация подлинности любых сообщений от конечного участника к PKI (CA/RA).
Подобная аутентификация может обеспечиваться следующим образом: PKI (CA/RA) передает конечному участнику секретное значение (ключ начальной аутентификации) и справочное значение (используемое для идентификации транзакции) некоторыми внешними способами. Ключ начальной аутентификации может затем использоваться для защиты соответствующих значений PKI.
Мы можем таким образом классифицировать схемы начальной
Замечание 1: мы не рассматриваем аутентификацию сообщений PKI к EE, т.к. она требуется ВСЕГДА. В любом случае открытый ключ СА может быть инсталлирован в оборудовании конечного участника или аутентификация может быть основана на ключе начальной аутентификации.
Замечание 2: процедура начальной
Будем считать, что "генерация ключа" происходит всякий раз, когда открытый или закрытый компоненты ключа впервые появляется в PKIMessage. Заметим, что это не препятствует централизованному сервису генерации ключа – реальная пара ключа может быть создана где-то еще и передана конечному участнику, RA или СА с использованием (собственного или стандартного) протокола запроса/ответа генератора ключа.
Существует три возможных размещения "генератора ключа": конечный участник, RA или СА.
После создания начального сертификата для конечного участника дополнительная гарантия может быть достигнута тем, что конечный участник явно подтверждает успешное получение сообщения, содержащего сертификат или указывающего на его создание. Естественно, это подтверждающее сообщение должно быть защищено (с помощью ключа начальной аутентификации или другим способом).
СА создает и передает конечному участнику данные активации – значения данных, отличные от ключей, необходимые для функционирования
Это дает две возможности: с подтверждением или без.
Приведенная выше классификация применима для большого числа схем начальной
В терминах приведенной выше классификации данная схема является самой простой:
В терминах потока сообщений данная схема означает, что требуется, чтобы было послано только сообщение от СА к конечному участнику. Сообщение должно содержать весь
В терминах приведенной выше классификации данная схема определяется следующим образом:
В терминах потока сообщений базовая схема аутентификации будет следующей (см. рис.18.1).
Если проверка подтверждающего сообщения не проходит, RA/CA должен отменить только что выпущенный сертификат, если он был опубликован или сделан доступным каким-либо еще способом.
(рис 18.1) Базовая схема аутентификацииДанная спецификация явно предназначена для случаев, когда конечный участник предоставляет соответствующее доказательство для RA, и RA затем сообщает СА, что доказательство получено (и проверено). Например, конечный участник, который хочет иметь сертифицированный ключ подписывания, может послать соответствующую подпись в RA, который затем уведомит СА, что конечный участник предоставил необходимое доказательство. Однако такая ситуация допустима не всегда (например, СА может допускать проверку
Для ключей подписывания конечный участник может подписать значение для доказательства обладания закрытым ключом.
Для ключей шифрования у конечного участника можно потребовать дешифровать значение, чтобы доказать, что ему известен закрытый ключ. Дешифрованное значение может быть получено прямо или косвенно.
Прямой метод состоит в том, что CA/RA создает случайный вызов, на который требуется немедленный ответ ЕЕ.
Рекомендуется задействовать
Для ключей согласования ключа конечный участник и CA/RA должны установить разделяемый секретный ключ, чтобы доказать, что конечный участник обладает закрытым ключом.
Заметим, что это накладывает определенные ограничения на ключи, которые могут быть сертифицированы данным СА – в частности, для ключей Диффи-Хеллмана конечный участник может свободно выбрать параметры алгоритма – предполагая, что СА в случае необходимости может создать короткую (или одноразовую) пару ключей с соответствующими параметрами.
Данное обсуждение касается только САs, которые являются корневыми СА для некоторого конечного участника.
Основа описанной здесь процедуры состоит в том, что СА защищает свой новый открытый ключ, используя предыдущий закрытый ключ, и наоборот. Таким образом, если СА изменяет свою пару ключей, он должен создать два дополнительных значения атрибута сертификата cACertificate, если сертификаты доступны с использованием Х.500 директории (всего четыре сертификата: OldWithOld; OldWithNew; NewWithOld; NewWithNew).
Когда СА изменяет свою пару ключей, это влияет на тех участников, которые получили старый открытый ключ внешними способами. Они должны будут получить доступ к новому открытому ключу СА, защищенному с помощью старого закрытого ключа СА. Однако это будет возможно только в течение ограниченного периода времени (до тех пор, пока они не смогут получать новый открытый ключ СА с помощью внешнего механизма). Это обычно легко достигается, когда сертификаты конечных участников истекают.
Структурой данных, используемой для защиты нового и старого открытых ключей, является стандартный сертификат (который также может содержать расширения). Никаких новых структур данных не требуется.
Замечание 1: хотя схема и может охватывать случаи, когда СА изменяет свою пару ключей более одного раза в течение периода действительности хотя бы одного из сертификатов ЕЕ, данное правило может иметь неоднозначный результат. Отсутствие данного правила означает, что период действительности пары ключей СА должен быть больше, чем период действительности любого сертификата, выпущенного данным СА с использованием данной пары ключей.
Замечание 2: данная схема заставляет ЕЕ получать (внешними способами) новый открытый ключ СА по истечении срока действия последнего сертификата, с использованием которого был подписан старый закрытый ключ СА. Требуют ли этого операции
Для
Старый закрытый ключ СА более не требуется. Тем не менее старый открытый ключ еще некоторое время используется. Старый открытый ключ не будет требоваться, когда все конечные участники данного СА безопасно получат новый открытый ключ СА.
Сертификат "старый с новым" должен иметь период действительности, начинающийся с момента создания новой пары ключей и кончающейся временем, когда все конечные участники данного СА безопасно получат новый открытый ключ СА (самое позднее – это дата истечения срока действия старого открытого ключа).
Сертификат "новый с новым" должен иметь период действительности, начинающийся со времени создания новой пары ключей и заканчивающийся временем следующего изменения СА своей пары ключей.
Обычно при проверке подписи проверяющая сторона, помимо прочего, должна убедиться, что сертификат содержит открытый ключ подписавшего. Однако, поскольку допускается, что СА может изменить свой ключ, существует ряд новых возможностей, которые приведены в таблице 18.1.
| Репозиторий содержит новый и старый открытые ключи | Репозиторий содержит только старый открытый ключ (например, задержка опубликования) | |||
| Сертификат подписавшего защищен с использованием нового открытого ключа | Случай 1: Это стандартный случай, когда проверяющий может непосредственно проверить сертификат без использования директории |
Случай 3: В этом случае проверяющий должен иметь доступ к директории, чтобы получить значение нового открытого ключа |
Случай 5: Хотя оператор СА не изменил директорию, проверяющий может проверить сертификат непосредственно – аналогично случаю 1 |
Случай 7: В этом случае оператор СА не изменил директорию, и проверка не проходит |
| Сертификат подписавшего защищен с использованием старого открытого ключа | Случай 2: В этом случае проверяющий должен иметь доступ к директории, чтобы получить значение старого открытого ключа |
Случай 4: В этом случае проверяющий может непосредственно проверить сертификат без использования репозитория |
Случай 6: Проверяющий думает, что это ситуация случая 2 и хочет получить доступ к директории; однако проверка не проходит |
Случай 8: Хотя оператор СА не изменил директорию, проверяющий может проверить сертификат непосредственно – случай аналогичен случаю 4 |
В этих случаях проверяющий имеет локальную копию открытого ключа СА, которую можно непосредственно использовать для проверки сертификата. Это та же самая ситуация, когда изменения ключа не было.
Заметим, что случай 8 может возникнуть в промежуток времени, когда оператор СА создал новую пару ключей и сохранил в директории измененные атрибуты. Случай 5 может иметь место, если оператор СА выпустил как сертификат подписывающего, так и сертификат проверяющего в течение данного интервала (оператор СА должен избегать такой ситуации, т.к. это приводит к невозможности проверки, как описано выше).
В случае 2 проверяющий должен получить доступ к старому открытому ключу СА. Проверяющий делает следующее:
caCertificate в директории и получает OldWithNew- сертификат (определяемый на основе периода действительности);Случай 2 встречается, когда оператор СА выпустил сертификат подписывающего, затем изменил ключ и выпустил сертификат проверяющего; таким образом, это вполне типичный случай.
В случае 3 проверяющий должен получить доступ к новому открытому ключу СА. Проверяющий делает следующее:
саCertificate в директории и получает NewWithOld- сертификат (определяемый на основе периода действительности);Случай 3 имеет место, когда оператор СА выпускает сертификат проверяющего, затем изменяет ключ и выпускает сертификат подписавшего; таким образом, это вполне типичный случай.
В данном случае СА выпускает
Заметим, что невозможность проверки является ошибкой оператора СА.
В данном случае СА выпускает сертификат подписывающего, защищенный новым ключом, без изменения атрибутов директории. Это означает, что проверяющий не имеет способов получить достоверную версию нового ключа СА, поэтому проверка не проходит.
Заметим, что невозможность проверки также является ошибкой оператора.
Как показано выше, проверка сертификата становится более сложной, так как допускается
Анализ возможных альтернатив аналогичен проверке сертификата.
Запрашивающий СА является СА, который станет субъектом
Запрашивающий СА должен быть "up and running" до начала выполнения операции
Сущностью данной схемы
Данная схема соответствует ситуации, когда два САs могут проверить подписи друг друга (они имеют некоторые общие точки доверия) или предусмотрена внешняя проверка исходного запроса
Авторизационный код используется для обеспечения аутентификации и целостности. Это осуществляется путем создания симметричного ключа, основанного на авторизационном коде и с использованием симметричного ключа для создания МАСs для всех передаваемых сообщений.
Запрашивающий СА инициирует обмен созданием случайного числа (случайное число запрашивающего). Затем запрашивающий СА посылает отвечающему СА сообщение запроса ). Поля в данном сообщении защищены от модификации с помощью МАС, основанного на авторизационном коде.
При получении сообщения отвечающий СА проверяет версию протокола, сохраняет случайное число запрашивающего, создает свое случайное число (случайное число отвечающего) и проверяет МАС. Затем он создает (и, если требуется, архивирует) новый сертификат запрашивающего, который содержит открытый ключ запрашивающего СА и подписан закрытым ключом подписывания отвечающего СА. Отвечающий СА посылает сообщение ответа сср ). Поля в данном сообщении защищены от модификации с помощью МАС, основанного на авторизационном коде.
При получении срр сообщения запрашивающий СА должен убедиться, что его собственное системное время позднее системного времени отвечающего СА, проверяет полученные случайные числа и действительность МАС. Запрашивающий СА отвечает PKIConfirm -сообщением. Поля в данном сообщении защищены от модификации с использованием МАС, основанного на авторизационном коде. Запрашивающий СА записывает запрошенный сертификат в репозиторий.
При получении PKIConfirm -сообщения отвечающий СА проверяет случайные числа и действительность МАС.
Замечания:
Ccr сообщение должно содержать "завершенный" запрос сертификата, что означает, что все поля (включая расширения BasicConstraints ) должны быть указаны запрашивающим СА.Срр сообщение должно содержать сертификат проверки отвечающего СА – если он присутствует, то запрашивающий СА должен затем проверить данный сертификат (например, с помощью внешнего механизма).Инициализированный участник может в любое время запросить сертификат (как часть процедуры изменения для любой другой цели). Данный запрос будет сделан с использованием сообщения запроса сертификата ( cr ). Если конечный участник уже имеет пару ключей подписывания (с соответствующим сертификатом проверки), то данное cr сообщение обычно бывает защищено подписью участника. СА возвращает новый сертификат (если запрос успешен) в CertRepMessage.
Когда период действительности пары ключей истекает, соответствующий конечный участник может запросить изменение ключа – это означает, что он может сделать запрос на создание СА нового сертификата для новой пары ключей. Запрос может быть сделан с использованием сообщения kur ). Если конечный участник уже имеет пару ключей подписывания (с соответствующим сертификатом проверки), то данное сообщение обычно бывает защищено цифровой подписью участника. СА возвращает новый сертификат (если запрос успешен) в сообщении ответа изменения ключа ( kup ), которое синтаксически идентично CertRepMessage.
Рассмотрим структуры данных, необходимые для управляющих сообщений PKI. Далее опишем ограничения на значения и последовательность событий для каждой из управляющих операций PKI и рассмотрим, как это может быть инкапсулировано в различные транспортные механизмы.
Все сообщения, используемые для управления PKI, имеют следующую структуру:
PKIMessage ::= SEQUENCE {
header PKIHeader,
body PKIBody,
protection [0] PKIProtection OPTIONAL,
extraCerts [1] SEQUENCE SIZE (1..MAX) OF
Certificate OPTIONAL
}
PKIHeader содержит информацию, которая является общей для многих сообщений PKI.
PKIBody содержит информацию, специфичную для сообщения.
PKIProtection, если используется, содержит биты, которые защищают сообщение PKI.
Поле extraCerts может содержать сертификаты, которые могут использоваться получателем. Например, оно может применяться СА или RA для предоставления конечному участнику сертификатов, которые он должен проверить с использованием собственного нового сертификата (если, например, СА, который выпустил сертификат конечного участника, не является для него корневым СА). Заметим, что данное поле не обязательно должно содержать
Все 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,
-- идентифицирует транзакцию; должно быть
-- одним и тем же соответственно в
-- сообщениях запроса, ответа и
-- подтверждения
senderNonce [5] OCTET STRING OPTIONAL,
recipNonce [6] OCTET STRING OPTIONAL,
-- nonces, используемые для защиты от
-- replay-атак, senderNonce вставляется
-- создателем данного сообщения;
-- recipNonce является nonce, предвари-
-- тельно вставленным в соответствующее
-- сообщение ожидаемым получателем
-- данного сообщения
freeText [7] PKIFreeText OPTIONAL,
-- может быть использовано для указания
-- контекстно-зависимых инструкций
generalInfo [8] SEQUENCE SIZE (1..MAX) OF
InfoTypeAndValue OPTIONAL
-- может быть использовано для указания
-- контекстно-зависимой информации
}
PKIFreeText ::= SEQUENCE SIZE (1..MAX) OF
UTF8String
-- текст представлен как UTF-8 String
-- (замечание: каждый UTF8String должен
-- включать RFC 1766 language tag для
-- указания языка, на котором
-- представлен текст)
Поле pvno для данной версии спецификации фиксировано.
Поле sender содержит имя отправителя PKIMessage.
Данное имя (в сочетании с senderKID, если оно используется) должно применяться для проверки защиты сообщения. Если об отправителе ничего не известно (например, в сообщении начальной sender должно содержать значение NULL ; это означает, что последовательность RDN имеет нулевую длину. В таком случае поле senderKID должно содержать идентификатор (например, номер), указывающий получателю на информацию о соответствующем разделяемом секрете, который используется для проверки сообщения.
Поле recipient содержит имя получателя PKIMessage. Данное имя (в сочетании с recipKID, если он используется) должно применяться для проверки защиты сообщения.
Поле protectionAlg указывает алгоритм, используемый для защиты сообщения. Если биты защиты не применяются (заметим, что PKIProtection является OPTIONAL ), то данное поле должно быть опущено; если биты защиты применяются, то данное поле также должно использоваться.
SenderKID и recipKID используются для указания того, какие ключи были задействованы для защиты сообщения ( recipKID обычно требуется только в том случае, если для защиты сообщения используются ключи Диффи-Хеллмана).
Поле transactionID в заголовке сообщения может использоваться для того, чтобы допускать корреляцию с предыдущим запросом. Например, в случае с RA может существовать много отложенных на данный момент запросов.
Поля senderNonce и recipNonce защищают PKIMessage от
В поле messageTime указывается время создания сообщения. Это помогает конечным участникам корректировать свое локальное время в соответствии с временем центральной системы.
Поле freeText может использоваться для передачи получателю читаемого сообщения (на некотором языке). Первый язык используется для указания требуемого в ответе языка.
Поле generalInfo может применяться для передачи получателю дополнительных данных для машинной обработки.
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
}
Конкретные типы будут описаны ниже.
Сообщение запроса сертификата состоит из запроса сертификата, необязательного поля доказательства обладания и необязательного поля регистрационной информации.
CertReqMessages ::= SEQUENCE SIZE
(1..MAX) OF CertReqMsg
CertReqMsg ::= SEQUENCE {
certReq CertRequest,
pop ProofOfPossession OPTIONAL,
-- содержание зависит от типа ключа
regInfo SEQUENCE SIZE(1..MAX) of
AttributeTypeAndValue OPTIONAL }
Поле доказательства обладания используется для демонстрации того, что участник, указанный в сертификате, действительно знает соответствующий закрытый ключ. Это поле может быть вычислено над содержимым поля certReq и может варьироваться в зависимости от типов алгоритма открытого ключа и режима выполнения.
Поле regInfo должно содержать только дополнительную информацию, относящуюся к контексту запроса сертификата, когда такая информация требуется для выполнения запроса сертификата. Данная информация может включать контактную информацию подписчика, сведения о счете или другую служебную информацию, необходимую для выполнения запроса сертификата.
Информация, непосредственно относящаяся к содержимому сертификата, должна быть включена в содержимое certReq. Однако включение RAs дополнительного содержимого в certReq может привести к тому, что поле regInfo.
Некоторые PKI-сообщения могут быть защищены для обеспечения целостности. (Заметим, что если для защиты сообщения используется
При применении защиты используется следующая структура:
PKIProtection ::= BIT STRING
Входом для вычисления PKIProtection является
ProtectedPart ::= SEQUENCE {
header PKIHeader,
body PKIBody
}
Могут быть ситуации, когда PKIProtection сознательно не используется для защиты сообщения (т.е. это OPTIONAL поле опущено), т.к. применяется другая, внешняя по отношению к PKI, защита. Это явно допускается. Примерами такой внешней защиты являются PKIMessage (или просто PKIBody, если безопасность информации PKIHeader обеспечивается посредством внешних механизмов). Следует заметить, однако, что многие такие внешние механизмы требуют, чтобы конечный участник уже имел сертификат открытого ключа и/или DN и/или другую аналогичную относящуюся к инфраструктуре информацию. Таким образом, это может не соответствовать начальной PKIProtection -параметры. В будущем, если внешние механизмы будут модифицированы таким образом, чтобы соответствовать сценариям начальной загрузки, использование PKIProtection станет более редким или вовсе необязательным.
В зависимости от условий биты PKIProtection могут содержать МАС или подпись. Возможны следующие случаи:
В данном случае отправитель и получатель разделяют секретную информацию (установленную внешними способами или полученную из предыдущих операций PKI). PKIProtection будет содержать значение МАС и protectionAlg будет следующим:
PasswordBasedMac ::=
OBJECT IDENTIFIER
-- {1 2 840 113533 7 66 13}
PBMParameter ::= SEQUENCE {
salt OCTET STRING,
owf AlgorithmIdentifier,
-- AlgId для односторонней
-- функции OWF
-- (рекомендуется SHA-1)
iterationCount INTEGER,
-- количество применений OWF
mac AlgorithmIdentifier
-- AlgId MAC (например,
-- DES-MAC, Triple-DES-MAC,
-- или HMAC)
}
В указанном выше protectionAlg значение присоединяется к разделяемому секрету. Затем применяется iterationCount раз, где секрет с добавлением является входом в первую итерацию и вход каждой итерации является выходом предыдущей. Выход последней итерации (называемый BASEKEY ) используется для создания симметричного ключа. Если алгоритм МАС требует K -битного ключа и K < H, то используются младшие K бит BASEKEY. Если K > H, то весь BASEKEY используется для младших Н битов ключа, ) применяется для следующих Н битов ключа и т.д.
Когда отправитель и получатель имеют сертификаты Диффи-Хеллмана с совместимыми параметрами, для защиты сообщения конечный участник должен создать симметричный ключ, основываясь на значении своего закрытого ключа DH и открытом ключе DH получателя PKI-сообщения.
PKIProtection будет содержать значение МАС с ключом, полученным из симметричного ключа и protectionAlg следующим образом:
DHBasedMac ::= OBJECT IDENTIFIER
-- {1 2 840 113533 7 66 30}
DHBMParameter ::= SEQUENCE {
owf AlgorithmIdentifier,
-- AlgId для односторонней
-- функции (OWF)
-- (рекомендуется SHA-1)
mac AlgorithmIdentifier
-- the MAC AlgId (например,
-- DES-MAC,
-- Triple-DES-MAC или НМАС)
}
protectionAlg применяется к результату вычислений DH. Выход (называемый BASEKEY ) используется для формирования симметричного ключа. Если алгоритм МАС требует K -битного ключа и K < H, то используются K младших битов BASEKEY. Если K > H, то используется весь BASEKEY для младших Н битов ключа, применяется для следующих младших Н битов ключа и т.д.
Если отправитель имеет пару ключей подписывания, он может просто подписать PKI-сообщение. PKIProtection будет содержать значение подписи, protectionAlg будет определяться значением AlgorithnIdentifier.
В случае, когда конечный участник отправляет защищенное PKI-сообщение RA, RA может перенаправить данное сообщение СА, присоединив свою собственную защиту (которая может быть МАС или цифровой подписью, в зависимости от информации и сертификатов, разделяемых RA и СА). Это предполагает вложение всего сообщения, посылаемого конечным участником, в новое PKI-сообщение. Используется следующая структура.
NestedMessageContent ::= PKIMessage
Перед тем как указывать типы, которые могут быть размещены в PKIBody, мы определим некоторые структуры данных, которые могут применяться.
Различные управляющие сообщения PKI требуют, чтобы инициатор сообщения указал некоторые поля, которые должны присутствовать в сертификате. Структура CertTemplate позволяет конечному участнику или RA указать как можно больше того, что должен содержать сертификат. CertTemplate аналогична Certificate, но все поля являются необязательными.
Заметим, что даже если инициатор полностью указал требуемое содержимое сертификата, СА имеет право модифицировать поля в сертификате, который он реально издает. Если модифицированный сертификат для запрашивающего неприемлем, можно задержать Confirmation -сообщение или послать Error -сообщение (с PKIStatus "rejection" ).
Когда в PKI сообщениях присутствуют зашифрованные значения (это могут быть либо закрытые ключи, либо сертификаты), используется структура данных EncryptedValue.
Применение этой структуры данных предполагает, что создатель и ожидаемый получатель имеют возможность соответственно зашифровать и расшифровать данные. Обычно это означает, что отправитель и получатель имеют или могут создать разделяемый секретный ключ.
Если получатель PKIMessage уже имеет закрытый ключ, используемый для дешифрования, поле encSymmKey может содержать
Все сообщения ответа включают определенную информацию о статусе. Определены следующие значения:
PKIStatus ::= INTEGER {
Granted (0),
-- получено то, что запрашивалось
grantedWithMods (1),
-- получено что-то подобное, что запрашивалось;
-- запрашивающий несет ответственность за
-- установленные отличия
rejection (2),
-- не получено то, что запрашивалось,
-- более подробная информация в сообщении
waiting (3),
-- запрос не обработан,
-- следует запросить позднее
revocationWarning (4),
-- данное сообщение содержит предупреждение,
-- что скоро будет отмена
revocationNotification (5),
-- уведомление, что произошла отмена
keyUpdateWarning (6)
-- изменение уже выполнено для oldCertId,
-- указанного в сообщении запроса изменения ключа
}
Отвечающий может использовать следующий синтаксис для предоставления более подробной информации о причинах неудачи.
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
}
Для идентификации конкретных сертификатов используется структура данных CertId.
Каждый корневой СА должен иметь возможность опубликовать свой текущий открытый ключ посредством некоторых "внешних" механизмов. Хотя такие механизмы находятся вне рассматриваемой предметной области, мы определим структуры данных, которые могут ими поддерживаться.
Доступны два общих метода: либо СА непосредственно публикует свой самоподписанный сертификат, либо данная информация доступна через Директорию (или ее эквивалент) и СА публикует хэш данного значения, позволяя тем самым перед использованием проверить целостность его сертификата.
OOBCert ::= Certificate
Поля в данном сертификате имеют следующие ограничения:
SubjectPublicKeyInfo );subject и issuer должны быть идентичны;subject является NULL, то оба расширения, subjectAltName и issuerAltName, должны присутствовать и иметь одно и то же значение;subject и issuer должны быть одни и те же).OOBCertHash ::= SEQUENCE {
hashAlg [0] AlgorithmIdentifier
OPTIONAL,
certId [1] CertId OPTIONAL,
hashVal BIT STRING
-- hashVal вычисляется для
-- самоподписанного
-- сертификата с идентификатором
-- certID.}
Смысл значения хэша состоит в том, чтобы любой, кто безопасно получил значение хэша (внешними способами), мог проверить самоподписанный сертификат данного СА.
Запрашивающий может указать, что он хочет архивировать значение закрытого ключа, используя структуру PKIArchiveOptions.
Запрашивающий может указать, что он хочет, чтобы PKI опубликовал сертификат, используя структуру PKIPublicationInfo.
Если запрос сертификата предназначен для пары ключей подписывания (т.е. запрос для верифицирующего сертификата), то доказательство обладания закрытым ключом подписывания демонстрируется с помощью структуры POPOSingingKey.
POPOSigningKeyInput ::= SEQUENCE {
authInfo CHOICE {
sender [0] GeneralName,
-- из PKIHeader (используется только в
-- том случае, если аутентифицированная
-- идентификация установлена
-- отправителем (например, DN из ранее
-- выпущенного и действительного
-- в данный момент сертификата))
publicKeyMAC [1] PKMACValue
-- используется, если в настоящий момент
-- не существует аутентифицированного
-- GeneralName для отправителя;
-- publicKeyMAC содержит основанный на
-- пароле MAC (используя protectionAlg
-- AlgId из PKIHeader) для
-- DER-представления publicKey
},
publicKey SubjectPublicKeyInfo
-- из CertTemplate
}
С другой стороны, если запрос сертификата выполнен для пары ключей шифрования (например, запрос для сертификата шифрования), то доказательство обладания закрытым ключом дешифрования может быть продемонстрировано одним из трех способов.
CertRequest (в управляющей структуре PKIArchiveOptions ).PKIConirm, используя ключ, полученный из данного симметричного ключа. Заметим, что если более одного CertReqMsg включено в PKIMessage, то СА использует разные симметричные ключи для каждого CertReqMsg, и МАС задействует ключ, полученный из конкатенации всех этих ключей. Процедура вычисления МАС использует PasswordBasedMacAlgId, определенный выше.POPODecKeyChall и POPODecKeyResp, см ниже) между CertReqMessages и CertRepMessages. Это "прямой" метод, как он определен выше. Данный метод обычно используется в окружении, в котором RA проверяет req’ не обязательно должно инкапсулировать req в качестве вложенного сообщения):Очевидно, что данный протокол является более длинным, но позволяет включать локальный RA, при этом сам сертификат реально не создается, пока не приведено доказательство обладания.
Если запрос сертификата выполнен для пары ключей согласования ключа (Key Agreement Key – KAK), то
Challenge используется PreferredSymmAlg и симметричный ключ, полученный из закрытого KAK СА и открытого ключа, для которого выполнен запрос сертификата. В качестве альтернативы POPOSigningKey, где поле alg есть DHBasedMAC и поле подписи есть МАС, в качестве четвертой альтернативы для демонстрации Сообщения вызова-ответа для доказательства обладания закрытым ключом шифрования определены следующим образом. Заметим, что обмен вызов-ответ связан с сообщением запроса сертификата (и тем самым с сообщениями ответа сертификата и подтверждением) с помощью , используемых в PKIHeader, и защитой (МАС или подписыванием), примененной к PKIMessage.
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.2) Полный протокол доказательства обладания закрытым ключем
Сообщение запроса инициализации содержит в PKIBody структуру данных CertReqMessage, которая описывает запрашиваемые сертификаты. Обычно SubjectPubKeyInfo, KeyId и Validity являются шаблонными полями, которые заменяются для каждого затребованного сертификата. Считается, что данное сообщение используется для первой инициализации участника в PKI.
Сообщение ответа инициализации в PKIBody структуру данных CertRepMessage, которая для каждого запрошенного сертификата имеет поле PKIStatusInfo, сертификат субъекта и, возможно, закрытый ключ (обычно зашифрованный protocolEncKey ).
Далее приводится синтаксис CertRepMessage. Заметим, что если защитой сообщения PKI является "разделяемая секретная информация", то любой сертификат, передаваемый в поле caPubs, может быть непосредственно доверенным как сертификат корневого СА инициатора.
Сообщение запроса PKIBody структуру данных CertReqMessages, которая специфицирует запрошенные сертификаты. Считается, что данное сообщение используется для существующих в PKI участников, которые хотят получить дополнительные сертификаты.
В качестве альтернативы PKIBody может применяться CertificationRequest. Данная структура может требоваться для пары ключей подписывания, когда необходимо взаимодействие с наследуемыми системами.
Сообщение ответа PKIBody структуру данных CertRepMessage, которая указывает значение статуса для каждого запрошенного сертификата, и дополнительно открытый ключ СА, информацию о неудаче, сертификат субъекта и закрытый зашифрованный ключ.
CertRepMessage ::= SEQUENCE {
CaPubs [1] SEQUENCE SIZE (1..MAX)
OF Certificate OPTIONAL,
Response SEQUENCE OF CertResponse }
CertResponse ::= SEQUENCE {
CertReqId INTEGER,
-- для установления соответствия между
-- ответом и запросом – 1 используется,
-- если certReqId в соответствующем
-- запросе не указан)
status PKIStatusInfo,
certifiedKeyPair CertifiedKeyPair
OPTIONAL,
rspInfo OCTET STRING OPTIONAL
-- аналогично id-regInfo-asciiPairs
-- OCTET STRING,
-- определенной для regInfo
-- в CertReqMsg
}
CertifiedKeyPair ::= SEQUENCE {
certOrEncCert CertOrEncCert,
privateKey [0] EncryptedValue OPTIONAL,
publicationInfo [1] PKIPublicationInfo
OPTIONAL
}
CertOrEncCert ::= CHOICE {
certificate [0] Certificate,
encryptedCert [1] EncryptedValue
}
Только одно из полей failInfo (в PKIStatusInfo ) и certificate (в CertifiedKeyPair ) может быть представлено в каждом CertResponse (в зависимости от статуса). Для некоторых значений статуса (например, waiting ) ни одно из дополнительных полей присутствовать не может.
Сертификат может быть получен при наличии EncryptedCert и соответствующего ключа дешифрования. Это делается для того, чтобы позволить СА возвращать значение сертификата, но с тем ограничением, что только определенный получатель может получить настоящий сертификат. Преимущество данного подхода состоит в том, что СА может возвращать сертификат даже при отсутствии доказательства, что запрашивающий является конечным участником, который может использовать соответствующий закрытый ключ (заметим, что доказательство не представлено до тех пор, пока СА не получит PKIConfirm -сообщение). Таким образом, СА не будет отменять сертификат до тех пор, пока не получит неправильное доказательство обладания.
Для CertReqMessages. Обычно SubjectPublicKeyInfo, KeyId и Validity являются шаблонными полями, которые заполняются для каждого изменяемого ключа. Считается, что данное сообщение применяется для
Для ответов об изменении ключа используется синтаксис CertRepMessage. Ответ идентичен ответу инициализации.
Синтаксис CertRepMessage описан выше.
Для запросов восстановления ключа используется синтаксис, идентичный запросу инициализации CertReqMesages. Обычно SubjectPublicKeyInfo и KeyId являются шаблонными полями, которые могут применяться для указания открытого ключа подписи, для которого был запрошен сертификат.
Для ответов восстановления ключа используется следующий синтаксис. Для некоторых значений статуса (например, waiting ) могут присутствовать дополнительные поля.
KeyRecRepContent ::= SEQUENCE { status
PKIStatusInfo,
newSigCert [0] Certificate OPTIONAL,
caCerts [1] SEQUENCE SIZE (1..MAX) OF
Certificate OPTIONAL,
keyPairHist [2] SEQUENCE SIZE (1..MAX) OF
CertifiedKeyPair OPTIONAL
}
При запросе отмены сертификата (или нескольких сертификатов) используется следующая структура данных. Имя запрашивающего присутствует в PKIHeader -структуре.
RevReqContent ::= SEQUENCE OF RevDetails
RevDetails ::= SEQUENCE {
certDetails CertTemplate,
-- позволяет запрашивающему указать
-- как можно больше
-- сведений о сертификате,
-- для которого требуется отмена
-- (например, для случаев, когда
-- serialNumber недоступен)
revocationReason ReasonFlags OPTIONAL,
-- причина запроса отмены
badSinceDate GeneralizedTime OPTIONAL,
-- указывает максимальные знания
-- отправителя
crlEntryDetails Extensions OPTIONAL
-- запрошенные crlEntryExtensions
}
Ответ на предыдущее сообщение. Если отмена произведена, то данное сообщение посылается запрашивающему. Отдельное уведомление об отмене может быть послано
RevRepContent ::= SEQUENCE {
status SEQUENCE SIZE (1..MAX)
OF PKIStatusInfo,
-- в той же последовательности,
-- как было послано в RevReqContent
revCerts [0] SEQUENCE SIZE
(1..MAX) OF CertId OPTIONAL,
-- Ids, для которых запрошена отмена
-- (тот же порядок, что и status)
crls [1] SEQUENCE SIZE (1..MAX)
OF CertificateList OPTIONAL
-- результирующие CRLs (может
-- быть более одного)
}
Запросы CertReqMessages ), что и обычные запросы
Ответы CertRepMessages ), что и для обычных ответов
Когда СА изменяет собственную пару ключей, для оповещения может использоваться следующая структура данных.
CAKeyUpdAnnContent ::= SEQUENCE {
OldWithNew Certificate,
-- старый pub, подписанный новым priv
NewWithOld Certificate,
-- новый pub, подписанный старым priv
NewWithNew Certificate
-- новый pub, подписанный новым priv
}
Данная структура может использоваться для оповещения о существовании сертификатов.
Считается, что данное сообщение будет использоваться в тех ситуациях (если они возникнут), когда не существует методов для опубликования сертификатов; не считается, что она будет использоваться, например, в том случае, если для опубликования сертификатов используется директория.
CertAnnContent ::= Certificate
При выполнении СА отмены или предположении отмены может быть выпущен специальный сертификат для оповещения об этом событии.
RevAnnContent ::= SEQUENCE {
status PKIStatus,
certId CertId,
willBeRevokedAt GeneralizedTime,
badSinceDate GeneralizedTime,
crlDetails Extensions OPTIONAL
-- детали extra CRL (например,
-- crl number, reason, location, etc.)
}
СА может использовать такое оповещение для уведомления субъекта о том, что его сертификат отменен или его предполагается отменить. Это обычно используется в тех случаях, когда запрос отмены приходит не от того субъекта, которого он касается.
Поле willBeRevokedAt содержит время, когда новая запись будет добавлена в соответствующие CRLs.
Когда СА выпускает новый CRL (или множество CRLs), для оповещения о данном событии может использоваться следующая структура данных.
CRLAnnContent ::= SEQUENCE OF CertificateList
Данная структура данных используется при трехстороннем протоколе в качестве заключительного PKIMessage. Его содержимое является одним и тем же во всех случаях – на самом деле оно не имеет содержимого, т.к. PKIHeader уже содержит всю необходимую информацию.
PKIConfirmContent ::= NULL
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 может послать всю/любую
-- интересующую информацию.
GenRepContent ::= SEQUENCE OF InfoTypeAndValue -- Получатель может игнорировать -- любое содержимое -- OBJ.IDs, которое он не распознает.
ErrorMsgContent ::= SEQUENCE {
pKIStatusInfo PKIStatusInfo,
errorCode INTEGER OPTIONAL,
-- конкретные для реализации
-- коды ошибок
errorDetails PKIFreeText OPTIONAL
-- конкретные для реализации
-- детали ошибок }
Синтаксис 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
}
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 обязан выполнить обмен
-- вызов-ответ с конечным участником, чтобы доказать,
-- что ему известен закрытый ключ
}
Считается, что протоколы должны включать подтверждающее сообщение для сообщения вызов-ответ.
Следующий алгоритм должен применяться при использовании 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 и конечным участником. Значение присоединяется к разделяемому секрету, и односторонняя функция ( ) применяется iterationCount раз, где секрет и являются входом в первую итерацию, и для каждой следующей итерации вход есть множество выходов предыдущей итерации, включая ключ 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
Альтернативой посылки ключа является посылка информации о том, как заново создать ключ, используя выбор KeyGenParameters (например, для многих реализаций RSA можно послать первое случайное простое число).
Рассматриваемая схема является минимальной схемой для поддержки PKI для протокола LDAPv2. Определим только компоненты, относящиеся к PKI. LDAP-серверы, функционирующие как репозитории PKI, должны поддерживать вспомогательные классы объектов и соответствующим образом интегрировать спецификацию данной схемы с общей схемой и другими схемами, специфичными для других приложений.
LDAPv2 является одним из протоколов для доступа к репозиторию PKI. Также определены другие протоколы, такие как HTTP. Если LDAP-сервер, доступный по LDAPv2, используется в качестве репозитория, минимальное требование состоит в том, что репозиторий должен поддерживать дополнительные записи каталога для сертификатов Х.509.
Определим атрибуты и классы объектов, используемые LDAP-серверами, функционирующими в качестве репозиториев PKI, которые должны понимать клиенты LDAP, взаимодействующие с этими репозиториями для
Объектами, представленными в репозитории, являются:
Следующий вспомогательный класс объекта может использоваться для представления
pkiUser OBJECT-CLASS ::= {
SUBCLASS OF { top}
KIND auxiliary
MAY CONTAIN {userCertificate}
ID joint-iso-ccitt(2) ds(5)
objectClass(6) pkiUser(21)
}
userCertificate ATTRIBUTE ::= {
WITH SYNTAX Certificate
EQUALITY MATCHING RULE
certificateExactMatch
ID joint-iso-ccitt(2) ds(5)
attributeType(4)
userCertificate(36)
}
Конечный участник может получить один или более сертификатов от одного или более СAs. Атрибут userCertificate должен использоваться для представления этих сертификатов в записи каталога , относящейся к данному пользователю.
Следующий вспомогательный класс объекта может применяться для представления
pkiCA OBJECT-CLASS ::= {
SUBCLASS OF { top}
KIND auxiliary
MAY CONTAIN {cACertificate |
certificateRevocationList |
authorityRevocationList |
crossCertificatePair }
ID joint-iso-ccitt(2) ds(5)
objectClass(6) pkiCA(22)
}
cACertificate ATTRIBUTE ::= {
WITH SYNTAX Certificate
EQUALITY MATCHING RULE
certificateExactMatch
ID joint-iso-ccitt(2) ds(5)
attributeType(4)
cACertificate(37)
}
crossCertificatePairATTRIBUTE::={
WITH SYNTAX CertificatePair
EQUALITY MATCHING RULE
certificatePairExactMatch
ID joint-iso-ccitt(2) ds(5)
attributeType(4)
crossCertificatePair(40)
}
Атрибут cACertificate записи каталога СА должен использоваться для хранения
Forward -элементы crossCertificatePair -reverse элементы crossCertificatePair -forward и reverse, в значении одного атрибута, имя выпускающего в одном сертификате должно соответствовать имени субъекта в другом и наоборот, и открытый ключ субъекта в одном сертификате должен иметь возможность проверять подпись в другом сертификате и наоборот.
Если присутствует элемент reverse, значение forward -элемента и значение reverse -элемента не обязательно должны являться значениями одного о того же атрибута; другими словами они могут являться значениями как одного атрибута, так и значениями двух атрибутов.
В случае v3 сертификатов ни один из перечисленных выше сертификатов не должен включать расширение basicConstraints со значением сА, установленным в FALSE.
Определение области относится исключительно к локальной политике.
certificateRevocationListATTRIBUTE::={
WITH SYNTAX CertificateList
EQUALITY MATCHING RULE
certificateListExactMatch
ID joint-iso-ccitt(2) ds(5)
attributeType(4)
certificateRevocationList(39)
}
Атрибут certificateRevocationList, если присутствует в конкретной записи СА, содержит CRL(s).
authorityRevocationListATTRIBUTE::={
WITH SYNTAX CertificateList
EQUALITY MATCHING RULE
certificateListExactMatch
ID joint-iso-ccitt(2) ds(5)
attributeType(4)
authorityRevocationList(38)
}
Атрибут authorityRevocationList, если присутствует в конкретной записи СА, содержит информацию об отмене, относящуюся к сертификатам, выпущенным для других САs.
Точки распространения CRL являются дополнительным механизмом, который может использоваться для распространения информации об отмене.
Если СА решает задействовать точки распространения CRL, для этого используется следующий класс объектов.
cRLDistributionPoint OBJECT-CLASS::= {
SUBCLASS OF { top }
KIND structural
MUST CONTAIN { commonName }
MAY CONTAIN {
certificateRevocationList |
authorityRevocationList |
deltaRevocationList }
ID joint-iso-ccitt(2) ds(5)
objectClass(6)
cRLDistributionPoint(19) }
Атрибуты certificateRevocationList и authorityRevocationList определены выше.
Атрибут commonName и атрибуты deltaRevocationList, определенные в Х.509, продублированы ниже.
commonName ATTRIBUTE::={
SUBTYPE OF name
WITH SYNTAX DirectoryString
ID joint-iso-ccitt(2) ds(5)
attributeType(4)
commonName(3)
}
deltaRevocationList ATTRIBUTE ::= {
WITH SYNTAX CertificateList
EQUALITY MATCHING RULE
certificateListExactMatch
ID joint-iso-ccitt(2) ds(5)
attributeType(4)
deltaRevocationList(53) }
Если СА выбирает использование
deltaCRL OBJECT-CLASS ::= {
SUBCLASS OF { top }
KIND auxiliary
MAY CONTAIN { deltaRevocationList }
ID joint-iso-ccitt(2) ds(5)
objectClass(6) deltaCRL(23)
}
Транспортные протоколы, описанные ниже, позволяют конечным участникам, RAs и CАs передавать друг другу PKI-сообщения. Не существует требований относительно применения конкретных механизмов безопасности на данном уровне, если сообщения PKI соответствующем образом защищены (это так, если используется OPTIONAL PKIProtection параметр, как определено для каждого сообщения).
Файл, содержащий сообщение PKI, должен содержать только
Такие файлы могут применяться для передачи PKI-сообщений, с помощью, например, FTP.
Используется следующий простой протокол, основанный на ТСР, для передачи PKI-сообщений. Данный протокол соответствует случаям, когда конечный участник (или RA) инициирует транзакцию и может принимать результаты.
Если транзакция инициируется PKI-участником (RA или СА), то конечный участник должен либо задействовать listener-процесс, либо иметь соответствующую ссылку, которая позволяет получать PKI-сообщения от компонента управления PKI.
Протокол предполагает существование listener-процесса на RA или СА, который может принимать PKI-сообщения на определенный порт (номер порта 829). Обычно инициатор связывается с данным портом и передает начальное PKI-сообщение для данного ID транзакции. Отвечающий передает PKI-сообщение и/или номер ссылки, который будет использоваться позднее для получения реального PKI- сообщения ответа.
Если на данный запрос получено несколько PKI-сообщений ответа (возможно, если некоторая часть запроса обрабатывается быстрее, чем остальные), то также возвращается новая ссылка.
Когда инициатором получено заключительное PKI-сообщение ответа, новая ссылка не используется.
Инициатор транзакции посылает получателю <<direct TCP-based PKI message>>. Получатель отвечает аналогичным сообщением.
<<direct TCP-based PKI message>> состоит из:
length (32 бита), flag (8 бит), value
Данный раздел описывает способы для пересылки сообщений в представлении ASN.1 для обменов, рассмотренных в предыдущем разделе, с помощью e-mail.
Простой MIME объект определяется следующим образом.
Content-Type: application/pkixcmp Content-Transfer-Encoding: base64 <<the ASN.1 DER-encoded PKIX-CMP message, base64-encoded>>
Данный объект MIME может быть послан или получен с использованием общего MIME, предоставляя простой почтовый транспорт для PKIX-CMP сообщений. Реализации могут также распознавать и задействовать MIME-тип application/x-pkixcmp (определенный в более ранних версиях), чтобы обеспечить обратную совместимость.
Данный подраздел описывает способы для пересылки сообщений в ASN.1 представлении для обменов, описанных в предыдущем разделе, с помощью НТТР.
Простой MIME объект описывается следующим образом.
Content-Type: application/pkixcmp
<<the ASN.1 DER-encoded
PKIX-CMP message>>
Данный MIME-объект может быть послан или получен с использованием НТТР, используя простой браузер-ориентированный транспорт для PKIX-CMP сообщений. Реализации могут также распознавать и использовать тип MIME application/x-pkixcmp (определенный в более ранних версиях), для обеспечения обратной совместимости.
Данный протокол предназначен для предоставления доступа к репозиториям PKI для получения информации и управления этой информацией. Протокол основан на LDAP v2, определенном в RFC 1777.
Рассмотрим требования для получения информации PKI X.509 из репозитория, включая сертификаты и CRLs.
Конечные участники и САs, используя подмножество протокола LDAPv2, получают информацию PKI из репозитория.
САs помещает информацию PKI в репозиторий, также используя подмножество протокола LDAPv2.
Рассмотрим получение информации PKI из репозитория и управление информацией PKI в нем. Опишем профиль протокола LDAPv2 для выполнения этих функций.
Приведем требования для получения информации PKI (сертификат, CRL или другая представляющая интерес информация) из записи в репозитории, когда данная запись (либо конечного участника, либо СА) имеет известное имя. При этом используется термин "чтение репозитория".
Рассмотрим требования, когда имя записи неизвестно, но может использоваться некоторая другая информация для фильтрации записей в репозитории. При этом используется термин "поиск в репозитории".
Рассмотрим требования для САs для добавления, удаления и модификации информации PKI (сертификат, CRL или другая представляющая интерес информация) в репозитории. При этом используется термин "модификация репозитория".
Далее описано подмножество LDAPv2 поддержки каждой из этих функций. Заметим, что сервис поиска в репозитории является более общим относительно сервиса чтения репозитория в терминах функциональности LDAPv2.
Для получения информации из записи, соответствующей имени субъекта или выпускающего сертификата, требуется подмножество из следующих трех операций LDAP:
BindRequest (и BindResponse) SearchRequest (и SearchResponse) UnbindRequest
Приложение, предоставляющее LDAP сервис чтения репозитория, должно реализовать следующее подмножество данной операции:
BindRequest ::= [APPLICATION 0] SEQUENCE {
version INTEGER (2),
name LDAPDN,
-- должен приниматься NULL LDAPDN
simpleauth [0] OCTET STRING
-- должен приниматься NULL simple }
Приложение, предоставляющее сервис чтения репозитория, может также реализовать другие возможности BindRequest.
Разные сервисы могут иметь различные требования безопасности. Одни сервисы могут допускать анонимный поиск, другие могут требовать аутентификации. Сервисы, допускающие анонимный поиск, могут разрешать поиск только на основе общего критерия.
Предполагается, что сервис чтения репозитория должен реализовывать некоторый уровень анонимного доступа к поиску. Сервис чтения репозитория может реализовывать аутентифицированный доступ к поиску.
Приложение, предоставляющее сервис чтения репозитория, должно полностью реализовать данный элемент протокола, при этом могут возвращаться только следующие коды ошибок при выполнении операции Bind:
success (0), operationsError (1), protocolError (2), authMethodNotSupported (7), noSuchObject (32), invalidDNSyntax (34), inappropriateAuthentication (48), invalidCredentials (49), busy (51), unavailable (52), unwillingToPerform (53), other (80)
Приложение, предоставляющее LDAP сервис чтения репозитория, должно реализовывать следующее подмножество SearchRequest:
SearchRequest ::= [APPLICATION 3] SEQUENCE {
baseObject LDAPDN,
scope ENUMERATED {baseObject (0), },
derefAliases ENUMERATED {
neverDerefAliases (0),
},
sizeLimit INTEGER (0),
timeLimit INTEGER (0),
attrsOnly BOOLEAN, -- FALSE only
filter Filter,
attributes SEQUENCE OF AttributeType
}
Filter ::= CHOICE {
present [7] AttributeType,
-- только "objectСlass"
}
Данное подмножество LDAPv2 SearchRequest обеспечивает операцию " read " LDAPv2: поиск объекта с использованием фильтра для проверки существования атрибута objectClass.
Приложение, предоставляющее сервис чтения репозитория, может также реализовать другие возможности SearchRequest.
Приложение, предоставляющее LDAP сервис поиска в репозитории, должно полностью реализовать SearchResponse.
Заметим, что в том случае, когда атрибут имеет несколько значений, например, userCertificate, SearchResponse содержит все значения, предполагая, что запрашивающий имеет достаточно прав доступа. У приложения или доверяющей группы может возникнуть необходимость выбрать для использования соответствующее значение. Заметим также, что получение сертификата из именованной записи не гарантирует, что сертификат будет включать то же самое DN, и в некоторых случаях subjectDN в сертификате может быть NULL.
Для поиска в репозитории записи, содержащей сертификат, CRL или другую интересующую информацию, с использованием произвольного критерия, необходимо подмножество следующих трех операций LDAP:
BindRequest (и BindResponse), SearchRequest (и SearchResponse) UnbindRequest
Далее приведено требуемое подмножество для каждой операции.
Приложение, предоставляющее сервис поиска в репозитории LDAP, должно реализовать следующее подмножество протокола SearchRequest.
SearchRequest ::= [APPLICATION 3] SEQUENCE {
baseObject LDAPDN,
scope ENUMERATED {
baseObject (0),
singleLevel (1),
wholeSubtree (2)
},
derefAliases ENUMERATED {
neverDerefAliases (0),
},
sizeLimit INTEGER (0 .. maxInt),
timeLimit INTEGER (0 .. maxInt),
attrsOnly BOOLEAN, -- FALSE only
filter Filter,
attributes SEQUENCE OF
AttributeType
}
Должны поддерживаться все аспекты SearchRequest, за исключением следующего:
neverDeferAliases для deferAliases.FALSE для attrsOnly.Данное подмножество предоставляет более общие возможности поиска. Это надмножество подмножества SearchRequest, определенного выше. Элементами, добавляемыми в данный сервис, являются:
singleLevel и wholeSubtree.sizeLimit.timeLimit.Приложение, предоставляющее сервис поиска в репозитории LDAP, может также реализовывать и другие аспекты SearchRequest.
Для добавления, удаления и модификации PKI информации в репозитории требуется подмножество следующих операций LDAP:
BindRequest (и BindResponse), ModifyRequest (и ModifyResponse), AddRequest (и AddResponse) DelRequest (и DelResponse), UnbindRequest
Далее определяется требуемое подмножество для каждой операции.
Приложение, предоставляющее сервис модификации репозитория LDAP, должно реализовывать следующее подмножество операций:
BindRequest ::= [APPLICATION 0] SEQUENCE {
version INTEGER (2),
name LDAPDN,
simpleauth [0] OCTET STRING }
Сервис модификации репозитория LDAP должен реализовывать аутентифицированный доступ.
Необходимые подмножества BindResponse являются теми же, что были описаны выше.
Приложение, предоставляющее сервис модификации в репозитории LDAP, должно реализовывать следующее подмножество протокола ModifyRequest.
ModifyRequest ::= [APPLICATION 6] SEQUENCE {
object LDAPDN,
modification SEQUENCE OF SEQUENCE {
operation ENUMERATED {
add (0),
delete (1)
},
modification SEQUENCE {
type AttributeType,
values SET OF
AttributeValue
}
}
}
Необходимо поддерживать только значения add и delete для ModifyRequest.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.