Definir SSLOptions.VerifyCertificate como True faz com que o servidor solicite um certificado a cada cliente recebido e valide a cadeia que ele apresenta. Essa validação estabelece que a cadeia do cliente é confiável. Isso não diz nada sobre se o certificado do cliente foi revogado desde que foi emitido.
Essa lacuna importa sempre que o certificado é a credencial: um notebook é perdido ou um funcionário deixa a empresa, o certificado emitido para ele é revogado e, até o dia em que expirar, ele continua abrindo uma sessão no seu servidor. A revogação só é verificada quando é solicitada, através de SSLOptions.SChannel_Options.Revocation.
As configurações de revogação são lidas enquanto um certificado de cliente está sendo validado, portanto elas não fazem nada a menos que SSLOptions.VerifyCertificate seja True, que é o que faz o servidor solicitar um certificado de cliente em primeiro lugar. Se um cliente que não apresenta nenhum certificado é recusado ou deixado passar é uma decisão separada, tomada por SSLOptions.VerifyCertificate_Options.FailIfNoCertificate.
oServer.SSL := True;
oServer.SSLOptions.IOHandler := iohSChannel;
oServer.SSLOptions.VerifyCertificate := True;
oServer.SSLOptions.VerifyCertificate_Options.FailIfNoCertificate := True;
oServer.SSLOptions.SChannel_Options.Revocation.Check := scrcChainExcludeRoot;
O status é obtido enquanto a cadeia de certificados é construída, portanto o ponto de distribuição de CRL ou o respondedor OCSP indicado pelo certificado do cliente é contatado durante o handshake. É por isso que a verificação está desativada por padrão: ela coloca uma requisição de saída no caminho de cada conexão que o servidor aceita.
Seleciona que parte da cadeia do cliente tem o seu status de revogação consultado.
| scrcDisabled | Padrão. Nenhum status de revogação é obtido e nenhum é exigido. |
| scrcEndCertificate | Somente o próprio certificado do cliente é verificado. A opção mais econômica, uma consulta por conexão. |
| scrcChainExcludeRoot | O certificado do cliente e os certificados intermediários que o emitiram são verificados, a raiz não. A escolha usual, porque a raiz da CA que emite os seus certificados de cliente 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 enquanto o servidor o aguarda. 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 uma conexão recebida nunca é atrasada por um respondedor. 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 do cliente, que é o comportamento de falha tolerante. Defina como False para rejeitar. Rejeitar é mais rigoroso, mas faz com que cada nova conexão dependa de o respondedor estar acessível a partir do servidor, de modo que uma indisponibilidade do respondedor se torna uma indisponibilidade para todos os seus clientes.
Decide o que acontece quando o certificado do cliente 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. Certificados emitidos por uma CA interna frequentemente não trazem nenhuma informação de revogação, portanto defina como False somente depois de saber que cada certificado que você entrega a um cliente publica uma.
Nenhuma das propriedades Ignore jamais aceita um certificado que retornou como comprovadamente revogado. Esse resultado é sempre rejeitado e o handshake falha.
Quando a verificação da cadeia recusa um cliente, o motivo é um dos seguintes:
| ecCryptRevoked | O certificado do cliente 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 do cliente não publica nenhuma informação de revogação. Rejeitado somente quando IgnoreNoRevocationCheck é False. |
Definir SSLOptions.Preset como tlspSecureDefaults habilita a verificação como scrcChainExcludeRoot no servidor, correspondendo ao que o mesmo preset já aplicava no cliente, e mantém as duas configurações de falha tolerante, de modo que um cliente que antes era admitido continua sendo admitido. Um escopo que você mesmo escolheu antes de aplicar o preset é deixado intacto.
oServer.SSLOptions.Preset := tlspSecureDefaults;