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,
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.
- Verificar se IDP e CDP GeneralName correspondem
- Ignore o CDP DistributionPoint tendo:
- Itere pela sequência de DistributionPoints da CDP:
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.