TsgcWebSocketClient | SChannel Certificate Revocation

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.

Check

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.

Timeout

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.

CacheOnly

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.

IgnoreRevocationOffline

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.

IgnoreNoRevocationCheck

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.

Erros relatados

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.

Padrões seguros

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;