Definir TLSOptions.VerifyCertificate como True estabelece que a cadeia de certificados do servidor é confiável e que ela nomeia o host ao qual você está se conectando. Isso não diz nada sobre se esse certificado foi revogado desde que foi emitido.
Essa lacuna importa: uma chave privada roubada cujo certificado foi revogado, mas ainda não expirou, continua se autenticando com sucesso, que é exatamente o caso que a revogação existe para cobrir. A revogação só é verificada quando é solicitada, através de TLSOptions.SChannel_Options.Revocation.
oClient.TLS := True;
oClient.TLSOptions.IOHandler := iohSChannel;
oClient.TLSOptions.VerifyCertificate := True;
oClient.TLSOptions.SChannel_Options.Revocation.Check := scrcChainExcludeRoot;
O status é obtido enquanto a cadeia de certificados é construída, o que significa que o ponto de distribuição de CRL ou o respondedor OCSP indicado pelo certificado é contatado durante o handshake. É por isso que a verificação está desativada por padrão: habilitá-la adiciona tráfego de rede a cada nova conexão.
Seleciona que parte da cadeia tem o seu status de revogação consultado.
| scrcDisabled | Padrão. Nenhum status de revogação é obtido e nenhum é exigido. |
| scrcEndCertificate | Somente o certificado do servidor é verificado. A opção mais econômica, uma consulta por conexão. |
| scrcChainExcludeRoot | O certificado do servidor e os certificados intermediários são verificados, a raiz não. A escolha usual, porque uma raiz autoassinada raramente publica uma CRL para si mesma. |
| scrcChain | Toda a cadeia, incluindo a raiz. |
Milissegundos permitidos para toda a obtenção da revogação, não por URL, de modo que um respondedor que não responde não possa travar o handshake. O padrão é 5000. Um valor zero deixa em vigor o padrão do Windows, que pode ser consideravelmente maior.
Quando True, somente os dados de revogação que o Windows já armazenou em cache são usados e o handshake nunca vai à rede, portanto nunca é atrasado. Um cache vazio deixa então o status desconhecido, o que IgnoreNoRevocationCheck decide. O padrão é False.
Decide o que acontece quando o respondedor não pôde ser alcançado. O padrão é True, aceitar o certificado, que é o comportamento de falha tolerante que os navegadores web usam. Defina como False para rejeitar. Rejeitar é mais rigoroso, mas faz com que cada conexão dependa de o respondedor estar acessível, de modo que uma indisponibilidade do respondedor se torna uma indisponibilidade da sua aplicação.
Decide o que acontece quando o certificado não publica nenhum ponto de distribuição de CRL nem nenhum respondedor OCSP, de modo que o seu status não pode ser estabelecido. O padrão é True, aceitá-lo.
Nenhuma das propriedades Ignore jamais aceita um certificado que retornou como comprovadamente revogado. Esse resultado é sempre rejeitado.
Quando a conexão é recusada, o motivo chega ao evento OnSChannelVerifyPeer como um dos seguintes:
| ecCryptRevoked | O certificado foi revogado pelo seu emissor. Sempre rejeitado. |
| ecCryptRevocationOffline | O respondedor não pôde ser alcançado. Rejeitado somente quando IgnoreRevocationOffline é False. |
| ecCryptNoRevocationCheck | O certificado não publica nenhuma informação de revogação. Rejeitado somente quando IgnoreNoRevocationCheck é False. |
Definir TLSOptions.Preset como tlspSecureDefaults habilita a verificação como scrcChainExcludeRoot, junto com os demais padrões reforçados, e mantém as duas configurações de falha tolerante, de modo que ativá-la não quebra uma conexão que antes funcionava. Um escopo que você mesmo escolheu antes de aplicar o preset é deixado intacto.
oClient.TLSOptions.Preset := tlspSecureDefaults;