Partilhar via


Semântica da lista de revogação de certificados (CRL) Crypt32

O Crypt32 oferece suporte à semântica da lista de certificados revogados (CRL) para verificação de revogação online. Este artigo fornece informações sobre como o Crypt32 usa CRLs para verificação de revogação on-line e como a pré-busca e o particionamento de CRL podem ser usados para melhorar o desempenho.

Introdução

Quando a API Crypt32 CertGetCertificateChain for chamada com a revogação online habilitada, ela tentará recuperar uma resposta OCSP ou CRL válida por tempo da seguinte maneira:

  • Verifique se uma resposta OCSP grampeada com tempo válido foi incluída no handshake.
  • Verifique se temos uma resposta OCSP ou CRL válida no cache de URL Cryptnet do usuário.
  • Verifique se temos uma CRL válida por tempo em um repositório do sistema, como HKLM\CA.
  • Para URL OCSP na extensão AIA do certificado de assunto, tente baixar a resposta OCSP do servidor OCSP.
    • Para ter sucesso, adicione a resposta OCSP ao cache de URL Cryptnet do usuário.
  • Para a extensão da CDP da CRL no certificado da entidade, tente baixar a CRL do servidor CRL da autoridade de certificação (CA).
    • Para ter sucesso, adicione a CRL ao cache de URL Cryptnet do usuário.

Para uma CRL adicionada ao cache de URL da Cryptnet, a próxima CRL será recuperada antes de expirar se a CRL tiver a seguinte extensão: "1.3.6.1.4.1.311.21.4" (Próxima publicação da CRL). Ao adicionar essa extensão, somente o download inicial da CRL ocorrerá durante a validação do certificado. Consulte a seção Pré-busca de CRL para obter mais informações sobre como o Crypt32 usa essa extensão para pré-buscar a próxima CRL.

Se uma autoridade de certificação emitir um grande volume de certificados, o número de entradas revogadas em uma CRL também poderá se tornar grande, aumentando o tamanho da CRL. Para manter o tamanho da CRL sob controle, a Microsoft recomenda e oferece suporte ao particionamento de CRL por meio da extensão "2.5.29.28" (Ponto de Distribuição de Emissão Consulte a seção Particionamento de CRL para obter mais informações sobre como o Crypt32 suporta o particionamento de CRL por meio dessa extensão.

As autoridades de certificação que estão considerando abandonar o suporte para OCSP e oferecer suporte apenas a CRLs precisam considerar o impacto que isso terá nos aplicativos que chamam a API CertGetCertificateChain com a revogação online habilitada:

  • Na primeira validação, o aplicativo de chamada fará um download de CRL sob demanda e impedirá que a API seja concluída até que a CRL seja baixada.
    • Para servidores TLS de alto volume, haverá downloads de alto volume correspondentes do servidor CRL da CA.
    • Se a CRL se tornar grande, isso terá um impacto direto na capacidade do servidor de lidar com um alto volume de downloads.
      • O tamanho da CRL pode ser limitado pelo suporte a CRLs particionadas.
  • As validações subsequentes usarão a CRL armazenada em cache até que a CRL expire. Quando a CRL expirar, o acima será repetido para a próxima validação.
    • Esse download de CRL sob demanda pode ser evitado adicionando a extensão Next CRL Publish.

As seções a seguir fornecem informações sobre pré-busca e particionamento de CRL para melhorar o desempenho da revogação online onde apenas CRLs são usadas.

Pré-busca de CRL

Uma CRL codificada tem os dois campos a seguir indicando quando a CRL foi publicada e por quanto tempo o cliente pode armazenar em cache antes de precisar recuperar a próxima CRL publicada.

ThisUpdate    GeneralizedTime,
NextUpdate    GeneralizedTime OPTIONAL,

Se NextUpdate estiver ausente, essa será a última CRL a ser publicada e nunca expirará.

Uma CRL pode conter a extensão "1.3.6.1.4.1.311.21.4" (Próxima Publicação de CRL), que também é codificada como GeneralizedTime. Quando essa extensão estiver presente, o Crypt32 tentará pré-buscar a próxima CRL publicada após esse PublishTime e antes de NextUpdate da seguinte maneira:

Dado, PublishPeriod = NextUpdate – PublishTime. Os três parâmetros de configuração a seguir são usados para determinar o início e o fim do PreFetchPeriod:

  • AfterPublishPreFetchDivisor
    • O início do PreFetchPeriod é atrasado após o PublishTime dividindo o PublishPeriod por esse divisor.
    • Padrão de 10
  • AntesPróximoAtualizarPreFetchDivisor
    • A conclusão do PreFetchPeriod ocorre antes de NextUpdate dividindo o PublishPeriod por esse divisor.
    • Padrão de 20
  • MinPreFetchPeriod
    • Dado, PreFetchPeriod = PreFetchPeriodFinishTime – PreFetchPeriodStartTime. A pré-busca só será habilitada se o PreFetchPeriod exceder esse mínimo.
    • Padrão de 1 hora

Dado o PreFetchPeriod calculado acima, um tempo aleatório é escolhido dentro desse PreFetchPeriod para cada cliente pré-buscar e baixar a CRL publicada do servidor.

Alguns exemplos de vezes e o PreFetchPeriod correspondente usando os valores de configuração padrão.

O CRL é válido por dois dias e publicado todos os dias:

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. 

A CRL é válida por oito dias e publicada a cada quatro dias:

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 

Observação

Se a CRL pré-buscada não for usada pelo cliente, a pré-busca acima será interrompida até que o cliente inicie um novo download sob demanda para essa CRL.

Particionamento de CRL

Esta seção fornece informações sobre como o Crypt32 suporta o particionamento de CRL.

Exemplo

Veja a seguir um exemplo de uma extensão de CDP e provedor de identidade (IDP) comumente formatada usada para particionamento de CRL.

Para a primeira partição de certificados emitidos pela autoridade de certificação:

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

Para a segunda partição de certificados emitidos pela autoridade de certificação, aponta para uma CRL diferente na CDP e no 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

Como você pode ver, a mesma URL de CRL http única é usada na CDP e no IDP. Além disso, as CRLs particionadas são assinadas diretamente pela autoridade de certificação e são aplicáveis a autoridades de certificação e certificados de usuário final.

A próxima seção fornece detalhes sobre a codificação ASN.1 das extensões IDP e CDP e o que é suportado pelo Crypt32.

Detalhes

Este é o ASN.1 para a extensão do Ponto de Distribuição de Emissão (IDP) ("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
}

Se uma CRL tiver um IDP, o Windows Client procederá da seguinte maneira:

  • Ignore os deslocados internos tendo:
    • onlySomeReasons
    • indiretoCRL
  • Suporta apenas IDPs com a opção fullName .
    • A CDP CRL também deve ter a opção fullName.
  • Se onlyContainsUserCerts ou onlyContainsCACerts:
    • Use a extensão de restrições básicas do certificado para determinar se o IDP é aplicável ao certificado.

Este é o ASN.1 para a extensão CDP em um certificado:

--------------------------------------------
-- 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

Um cliente Windows irá:

  • Itere pela sequência de GeneralNames do IDP até uma correspondência com um nome de CDP:
    • Itere pela sequência de DistributionPoints da CDP:
      • Ignore o CDP DistributionPoint tendo:
        • Razões
        • cRLIssuer
      • Ignore o CDP DistributionPoint se ele não tiver uma opção fullName para DistributionPointName.
      • Itere pela sequência de GeneralNames da CDP:
        • Verificar se IDP e CDP GeneralName correspondem
          • Se IsSameGeneralName(), temos uma correspondência e a CRL pode ser usada para o certificado de assunto.

IsSameGeneralName(IDP_GeneralName, CDP_GeneralName)

O IDP e o CDP devem ter a mesma opção GeneralName . Para a mesma escolha, compare o nome do IDP e do CDP de acordo com a escolha:

  • rfc822Nome
    • Comparação de cadeia de caracteres sem distinção entre maiúsculas e minúsculas. Sem % de normalização de caracteres.
  • dNSName
    • Comparação de cadeia de caracteres sem distinção entre maiúsculas e minúsculas. Sem % de normalização de caracteres.
  • uniformResourceLocator (URL)
    • Comparação de cadeia de caracteres sem distinção entre maiúsculas e minúsculas. Sem % de normalização de caracteres.
  • otherName
    • O valor binário específico do OID e do OID é comparado.
  • ID registrado
    • Os OIDs são comparados.
  • diretórioNome
    • Os bytes de nome codificados são comparados.
  • iPAddress
    • Os bytes OCTET codificados são comparados.
  • x400Endereço
    • Não há suporte.
  • nomeDoPartidário
    • Não há suporte.

A expectativa é que a opção uniformResourceLocator GeneralName seja usada.

CertGetCertificateChain

CertGetCRLContextProperty

Funções de criptografia