Поделиться через


Семантика отзыва сертификатов Crypt32 (CRL)

Crypt32 поддерживает семантику списка отзыва сертификатов (CRL) для проверки отзыва по сети. В этой статье содержатся сведения о том, как Crypt32 использует crLs для проверки отзыва через Интернет и как предварительное получение и секционирование CRL можно использовать для повышения производительности.

Введение

Когда API Crypt32 CertGetCertificateChain вызывается с включенным онлайн-отзывом, он попытается получить допустимый ответ OCSP или CRL следующим образом:

  • Проверьте, включен ли в подтверждение подтверждения время допустимого срезаного ответа OCSP.
  • Проверьте, есть ли у нас допустимый ответ OCSP или список отзыва сертификатов в кэше URL-адресов Cryptnet пользователя.
  • Убедитесь, что у нас есть допустимое время CRL в системном хранилище, например HKLM\CA.
  • Для URL-адреса OCSP в расширении AIA сертификата субъекта попытайтесь скачать ответ OCSP с сервера OCSP.
    • Для успешного выполнения добавьте ответ OCSP в кэш URL-адресов Cryptnet пользователя.
  • Для расширения CDP CRL в сертификате субъекта попытайтесь скачать список отзыва сертификатов с сервера CRL центра сертификации (ЦС).
    • Для успешного выполнения добавьте список отзыва сертификатов в кэш URL-адресов Cryptnet пользователя.

Для CRL, добавленного в кэш URL-адресов Cryptnet, следующий список отзыва сертификатов будет получен до истечения срока действия, если список отзыва сертификатов имеет следующее расширение: "1.3.6.1.4.1.311.21.4" (Следующая публикация CRL). Добавив это расширение, во время проверки сертификата будет выполняться только начальное скачивание списка отзыва сертификатов. Дополнительные сведения о том, как Crypt32 использует это расширение для предварительного получения следующего списка отзыва сертификатов, см . в разделе предварительного получения списка отзыва сертификатов cRL .

Если ЦС выдает большой объем сертификатов, то количество отозванных записей в списке отзыва также может стать большим, увеличив размер списка отзыва сертификатов. Чтобы сохранить размер списка отзыва сертификатов, корпорация Майкрософт рекомендует и поддерживает секционирование CRL с помощью расширения "2.5.29.28" (Выдача точки распространения), добавленного в скачанный список отзыва сертификатов. Дополнительные сведения о том, как Crypt32 поддерживает секционирование CRL с помощью этого расширения, см . в разделе секционирования CRL.

ЦС рассматривает возможность удаления поддержки OCSP и только вспомогательных ЦР необходимо учитывать влияние, которое будет влиять на приложения, вызывающие API CertGetCertificateChain с включенным онлайн-отзывом:

  • При первой проверке вызывающее приложение будет выполнять скачивание CRL по запросу и блокирует выполнение API до скачивания списка отзыва сертификатов.
    • Для серверов TLS большого объема будут выполняться соответствующие загрузки большого объема с сервера CRL ЦС.
    • Если список отзыва сертификатов становится большим, он будет иметь прямое влияние на сервер, который сможет обрабатывать большие объемы загрузки.
      • Размер списка отзыва сертификатов может быть ограничен поддержкой секционированных crls.
  • Последующие проверки будут использовать кэшированный список отзыва сертификатов до истечения срока действия списка отзыва сертификатов. По истечении срока действия списка отзыва сертификатов указанные выше значения будут повторяться для следующей проверки.
    • Это можно избежать загрузки CRL по запросу, добавив расширение "Следующая публикация CRL".

В следующих разделах содержатся сведения о предварительной выборке и секционирование CRL для повышения производительности отзыва в Сети, где используются только crLs.

Предварительная получение списка отзыва сертификатов

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

ThisUpdate    GeneralizedTime,
NextUpdate    GeneralizedTime OPTIONAL,

Если NextUpdate отсутствует, это последний список отзыва сертификатов, который будет опубликован и никогда не истекает.

CRL может содержать расширение "1.3.6.1.4.1.311.21.4" (Следующая публикация CRL), которое также закодировано как GeneralizedTime. При наличии этого расширения Crypt32 попытается предварительно получить следующий опубликованный список отзыва сертификатов после этого publishTime и перед NextUpdate следующим образом:

Да, PublishPeriod = NextUpdate – PublishTime. Для определения начала и окончания preFetchPeriod используются следующие три параметра конфигурации:

  • AfterPublishPreFetchDivisor
    • Начало preFetchPeriod отложено после публикации времени, разделив PublishPeriod этим делителем.
    • Значение по умолчанию — 10
  • ПередNextUpdatePreFetchDivisor
    • Окончание preFetchPeriod происходит перед NextUpdate путем деления PublishPeriod на этот делитель.
    • Значение по умолчанию — 20
  • MinPreFetchPeriod
    • Да, PreFetchPeriod = PreFetchPeriodFinishTime – PreFetchPeriodStartTime. Предварительная выборка включена только в том случае, если preFetchPeriod превышает этот минимум.
    • Значение по умолчанию — 1 час

Учитывая приведенный выше вычисляемый preFetchPeriod, случайный момент времени выбирается в рамках этого preFetchPeriod для каждого клиента, чтобы предварительно получить и скачать опубликованный список отзыва сертификатов с сервера.

В некоторых примерах и соответствующих параметрах PreFetchPeriod используются значения конфигурации по умолчанию.

CRL действителен в течение двух дней и публикуется каждый день:

ThisUpdate:  Nov 05 08:00 
NextUpdate:  Nov 07 08:00 
PublishTime: Nov 06 08:00 

PublishPeriod = 24 hours 
PreFetchPeriodStartTime  = PublishTime + 24/10 (2.4 hours) 
PreFetchPeriodFinishTime = NextUpdate – 24/20 (1.2 hours) 

PreFetchPeriod = Nov 06 10:24 .. Nov 07 06:48 = 20:24  

Clients would randomly pre-fetch in the above PreFetchPeriod. 

CRL действителен в течение восьми дней и публикуется каждые четыре дня:

ThisUpdate:  Nov 03 08:00 
NextUpdate:  Nov 11 08:00 
PublishTime: Nov 07 08:00 

PublishPeriod = 96 hours 
PreFetchPeriodStartTime  = PublishTime + 96/10 (9.6 hours) 
PreFetchPeriodFinishTime = NextUpdate – 96/20 (4.8 hours) 

PreFetchPeriod = Nov 07 17:36 .. Nov 11 03:12 = 81:36 

Clients would randomly pre-fetch in the above PreFetchPeriod 

Примечание.

Если предварительно извлекаемый список отзыва сертификатов не используется клиентом, то указанный выше предварительный выбор будет остановлен до тех пор, пока клиент не инициирует новое скачивание по запросу для этого списка отзыва сертификатов.

Секционирование CRL

В этом разделе содержатся сведения о том, как Crypt32 поддерживает секционирование списков отзыва сертификатов.

Пример

Ниже приведен пример часто отформатированного расширения CDP и поставщика удостоверений , используемого для секционирования CRL.

Для первой секции сертификатов, выданных ЦС:

Cert CDP:
[1]CRL Distribution Point
     Distribution Point Name:
          Full Name:
               URL=http://crl.godaddy.com/first.crl

CRL IDP:
Distribution Point Name:
     Full Name:
               URL=http://crl.godaddy.com/first.crl
Only Contains User Certs=No
Only Contains CA Certs=No
Indirect CRL=No

Для второй секции сертификатов, выданных центром сертификации, указывает на другой список отзыва сертификатов в CDP и IDP:

Cert CDP:
[1]CRL Distribution Point
     Distribution Point Name:
          Full Name:
               URL=http://crl.godaddy.com/second.crl

CRL IDP:
Distribution Point Name:
     Full Name:
               URL=http://crl.godaddy.com/second.crl
Only Contains User Certs=No
Only Contains CA Certs=No
Indirect CRL=No

Как видно, один и тот же URL-адрес http CRL используется как в CDP, так и в удостоверений поставщика удостоверений. Кроме того, секционированные crls подписаны ЦС и применимы как к центрам сертификации, так и к сертификатам конечных пользователей.

В следующем разделе содержатся сведения о кодировке ASN.1 расширений поставщика удостоверений и CDP и поддерживаемых Crypt32.

Сведения

Это ASN.1 для расширения "Точка распространения "Поставщик удостоверений" ("2.5.29.28"):

--------------------------------------------
-- CRL Issuing Distribution Point Extension
--------------------------------------------
IssuingDistributionPoint ::= SEQUENCE {
    issuingDistributionPoint    [0] EXPLICIT DistributionPointName OPTIONAL,
    onlyContainsUserCerts       [1] IMPLICIT BOOLEAN DEFAULT FALSE,
    onlyContainsCACerts         [2] IMPLICIT BOOLEAN DEFAULT FALSE,
    onlySomeReasons             [3] IMPLICIT ReasonFlags OPTIONAL,
    indirectCRL                 [4] IMPLICIT BOOLEAN DEFAULT FALSE
} --#public—

DistributionPointName ::= CHOICE {
    fullName                [0] IMPLICIT GeneralNames,
    nameRelativeToCRLIssuer [1] IMPLICIT RelativeDistinguishedName
}

GeneralNames ::= SEQUENCE OF GeneralName

GeneralName ::= CHOICE {
    otherName               [0] IMPLICIT OtherName,
    rfc822Name              [1] IMPLICIT IA5STRING,
    dNSName                 [2] IMPLICIT IA5STRING,
    x400Address             [3] IMPLICIT SeqOfAny,
    directoryName           [4] EXPLICIT NOCOPYANY,    -- really Name
    ediPartyName            [5] IMPLICIT SeqOfAny,
    uniformResourceLocator  [6] IMPLICIT IA5STRING,
    iPAddress               [7] IMPLICIT OCTETSTRING,
    registeredID            [8] IMPLICIT EncodedObjectID
}

Если у CRL есть идентификатор поставщика удостоверений, клиент Windows будет продолжаться следующим образом:

  • Игнорировать наличие поставщиков удостоверений:
    • onlySomeReasons
    • непрямыйCRL
  • Поддерживаются только поставщики удостоверений с выбором fullName .
    • CdP CRL также должен иметь полный выбор имени.
  • Если толькоContainsUserCerts или onlyContainsCACerts:
    • Используйте базовое расширение ограничений сертификата для определения применимости поставщика удостоверений к сертификату.

Это ASN.1 для расширения CDP в сертификате:

--------------------------------------------
-- CRL Distribution Points Extension
--------------------------------------------
CRLDistributionPoints ::= SEQUENCE OF DistributionPoint

DistributionPoint ::= SEQUENCE {
    distributionPoint       [0] EXPLICIT DistributionPointName OPTIONAL,
    reasons                 [1] IMPLICIT ReasonFlags OPTIONAL,
    cRLIssuer               [2] IMPLICIT GeneralNames OPTIONAL
}

DistributionPointName see above

Клиент Windows:

  • Выполните итерацию по последовательности idP generalNames до совпадения с именем CDP:
    • Выполните итерацию по последовательности CDP в DistributionPoints:
      • Пропустить наличие CDP DistributionPoint :
        • Причин
        • cRLIssuer
      • Пропустите CDP DistributionPoint, если у него нет полного выбора имени для DistributionPointName.
      • Выполните итерацию по последовательности CDP generalNames:
        • Проверка соответствия idP и CDP GeneralName
          • Если IsSameGeneralName(), у нас есть совпадение и список отзыва сертификатов можно использовать для сертификата субъекта.

IsSameGeneralName(IDP_GeneralName, CDP_GeneralName)

Идентификатор поставщика удостоверений и CDP должны иметь одинаковый выбор GeneralName . Для того же выбора сравнивайте имя поставщика удостоверений и CDP в соответствии с выбором:

  • rfc822Name
    • Сравнение нечувствительных строк регистра. Нормализация символов отсутствует.
  • dNSName
    • Сравнение нечувствительных строк регистра. Нормализация символов отсутствует.
  • uniformResourceLocator (URL-адрес)
    • Сравнение нечувствительных строк регистра. Нормализация символов отсутствует.
  • otherName
    • Сравниваются определенные двоичные значения OID и OID.
  • зарегистрированный идентификатор
    • Сравниваются идентификаторы OID.
  • directoryName
    • Сравниваются байты закодированного имени.
  • iPAddress
    • Сравниваются закодированные байты OCTET.
  • x400Address
    • Не поддерживается.
  • ediPartyName
    • Не поддерживается.

Ожидается, что будет использоваться выбор универсального имени общего имениResourceLocator.

CertGetCertificateChain

CertGetCRLContextProperty

Криптографические функции