Основная обработка сертификата
Действия по основной обработке сертификата, выполняемые для сертификата i (для всех i в [1..n]), перечислены ниже.
- Проверить основную информацию сертификата. Сертификат должен удовлетворять каждому из следующих условий:
- Сертификат подписан working_public_key_algirithm, с использованием working_public_key и working_public_parameters.
- Период действительности сертификата включает текущее время.
- В текущий момент времени сертификат не отменен и не имеет статуса приостановленного. Это может быть определено получением соответствующего CRL, информации о статусе или внешними механизмами.
- Имя выпустившего сертификат есть working_issuer_name.
- Если сертификат i является самовыпущенным, и это не последний сертификат в пути, пропустить данный шаг для сертификата i. В противном случае убедиться, что имя субъекта расположено в одном из Permitted_subtrees для уникальных имен Х.500 и что каждое из альтернативных имен в расширении subjectAltName (критичном или некритичном) расположено в одном Permitted_subtrees для данного типа имени.
- Если сертификат i является самовыпущенным, и это не последний сертификат в пути, пропустить данный шаг для сертификата i. В противном случае убедиться, что имя субъекта не расположено ни в одном из Excluded_subtrees для уникальных имен Х.500 и что каждое альтернативное имя в расширении subjectAltName (критичное или некритичное) не расположено ни в одном из Excluded_subtrees для данного типа имени.
- Если в сертификате имеется расширение политик сертификации и valid_policy_tree не NULL, обработать информацию политики с помощью следующих шагов в указанном порядке:
- Для каждой политики 2, не эквивалентной 2, в расширении политик сертификации пусть P-OID обозначает OID политики Р и P-Q обозначает множество квалификаторов для политики Р. Выполняются следующие шаги в указанном порядке:
- Если valid_policy_tree включает узел глубины i-1, где P-OID принадлежит expected_policy_set, создать подчиненный узел следующим образом: установить valid_policy в OID-P; установить qualifier_set в P-Q и установить expected_policy_set в {P-OID}.
Например, рассмотрим valid_policy_tree с узлом глубины i-1, где expected_policy_set есть {Gold, White}. Предположим, что политики сертификации Gold и Silver присутствуют в расширении политик сертификации сертификата i. Это означает, что политика Gold соответствует, а политика Silver – нет. Данное правило будет создавать подчиненный узел глубины i для политики Gold. Результат показан на рис. 17.3. - Если нет соответствия на шаге (1) и valid_policy_tree включает узел глубины i-1 с действительной политикой anyPolicy, создается подчиненный узел со следующими значениями: установить valid_policy в P-OID; установить qualifier_set в P-Q и установить expected_policy_set в {P-OID}.
Например, рассмотрим valid_policy_tree с узлом глубины i-1, где valid_policy есть anyPolicy. Предположим, что политики сертификации Gold и Silver присутствуют в расширении политик сертификации сертификата i. Политика Gold не имеет квалификатора, но политика Silver имеет квалификатор, Q-Silver. Если Gold и Silver не соответствуют (1), данное правило будет создавать два подчиненных узла глубины i, по одному на каждую политику. Результат показан на рис. 17.4.
- Если valid_policy_tree включает узел глубины i-1, где P-OID принадлежит expected_policy_set, создать подчиненный узел следующим образом: установить valid_policy в OID-P; установить qualifier_set в P-Q и установить expected_policy_set в {P-OID}.
- Если расширение политик сертификации включает политику anyPolicy с квалификатором, установленным в AP-Q и либо (а) inhibit_any_policy есть больше 0, либо (b) i<n и сертификат самовыпущенный, тогда:
Для каждого узла в valid_policy_tree глубины i-1, для каждого значения в expected_policy_set (включая anyPolicy), которое не присутствует в подчиненном узле, создается подчиненный узел со следующими значениями: установить valid_policy в значение из expected_policy_set в родительском узле; установить qualifier_set в AP-Q и установить множество expected_policy_set в значение в valid_policy из данного узла.
Например, рассмотрим valid_policy_tree с узлом глубины i-1, где expected_policy_set есть {Gold, Silver}. Предположим, что anyPolicy присутствует в расширении политик сертификации сертификата i, но Gold и Silver нет. Данное правило будет создавать два подчиненных узла глубины i, по одному для каждой политики.
Результат показан на рис. 17.5.
- Если существует узел в valid_policy_tree глубины i-1 или менее без каких- либо подчиненных узлов, удалить данный узел. Повторять этот шаг до тех пор, пока не останется узлов глубины i-1 или менее без подчиненных узлов.
Например, рассмотрим valid_policy_tree, показанную на рис. 17.6. Два узла глубины i-1, которые помечены ‘X’, не имеющие подчиненных узлов, удаляются. Применяя данное правило к результирующему дереву, узел глубины i-2, помеченный как ‘Y’, будет удален. Следующее применение правила не вызовет удаления каких-либо узлов, и данный шаг завершится. - Если расширение политик сертификации было помечено как критичное, установить criticality_indicator во всех узлах глубины i в TRUE. Если расширение политик сертификации было помечено как некритичное, установить criticality_indicator во всех узлах глубины i в FALSE.
Рис. 17.3. Обработка точного соответствия
Рис. 17.4. Обработка несоответствующих политик, когда конечный узел специфицирует anyPolicy
Рис. 17.5. Обработка несоответствующих политик, когда расширение политик сертификации специфицирует anyPolicy
Рис. 17.6. Сокращение valid_policy_tree
- Для каждой политики 2, не эквивалентной 2, в расширении политик сертификации пусть P-OID обозначает OID политики Р и P-Q обозначает множество квалификаторов для политики Р. Выполняются следующие шаги в указанном порядке:
- Если расширение политик сертификации не присутствует, установить valid_policy_tree в NULL.
- Проверить: либо explicit_policy больше нуля, либо valid_policy_tree не эквивалентно NULL;
Если любой из шагов (1), (2), (3) или (6) не завершается успешно, процедура прекращается, возвращается индикация неудачной проверки и соответствующая причина.
Если i не равно n, продолжается выполнение подготовительных шагов. Если i равно n, выполняются шаги wrap-up.