TsgcUDPCLient › Eventos › OnDTLSVerifyPeer

OnDTLSVerifyPeer Evento

Disparado durante o handshake DTLS, de modo que a aplicação possa inspecionar e aceitar ou rejeitar o certificado do peer.

Sintaxe

property OnDTLSVerifyPeer: TsgcUDPDTLSVerifyPeerEvent;
// TsgcUDPDTLSVerifyPeerEvent = function(Sender: TObject; Certificate: TIdX509; AOk: Boolean; ADepth, AError: Integer): Boolean of object

Parâmetros

NameTypeDescrição
SenderTObjectO componente que disparou o evento.
CertificateTIdX509O certificado que está sendo verificado no momento. Leia dele Subject, Issuer, SerialNumber, notBefore, notAfter ou FingerprintAsString. O objeto pertence ao engine DTLS, é válido apenas durante a chamada e não deve ser liberado pelo handler.
AOkBooleanO veredito que o OpenSSL já alcançou para este certificado. True quando a verificação de cadeia e a verificação de VerifyDepth passaram, False quando alguma delas falhou. Retorne este valor para respeitá-lo.
ADepthIntegerPosição de Certificate na cadeia. O evento é disparado uma vez por certificado, 0 é o próprio certificado do peer e valores maiores sobem em direção à raiz.
AErrorIntegerO código de erro de verificação do OpenSSL para este certificado (uma das constantes X509_V_ERR_), 0 quando nenhum erro foi detectado.

Valor de retorno

True aceita o certificado e permite que o handshake continue, False o rejeita e encerra o handshake. É este o valor que decide o resultado, portanto retorne AOk para respeitar o veredito do OpenSSL e retorne False para os certificados que a aplicação rejeita segundo as suas próprias regras. Retornar True incondicionalmente descarta a verificação de cadeia e a verificação de profundidade, que é exatamente o comportamento que a mudança de aplicação removeu da biblioteca. Quando nenhum handler está atribuído, a biblioteca retorna AOk, portanto uma aplicação só precisa de um handler para acrescentar regras próprias, não para obter o comportamento correto de cadeia. (Boolean)

Valor Padrão

—

Observações

Disparado pelo engine DTLS durante o handshake quando DTLS é True e DTLSOptions.VerifyCertificate está habilitado. Use o evento para aplicar regras de validação específicas da aplicação (por exemplo, fixar o Common Name esperado, verificar um repositório de certificados personalizado ou registrar o fingerprint do certificado) sobre a validação de cadeia realizada pelo OpenSSL. O handler deve ser implementado de forma thread-safe porque é invocado na thread leitora DTLS antes de qualquer datagrama ser aceito.

A validação de cadeia agora é realmente aplicada. Anteriormente o resultado calculado pelo OpenSSL era descartado, portanto, com VerifyCertificate = True, qualquer certificado era aceito, inclusive um emitido por uma autoridade não confiável. Um certificado cuja cadeia não valida agora encerra o handshake. VerifyCertificate é False por padrão, portanto nem a validação de cadeia nem este evento são executados até que você o habilite. O valor retornado pelo handler é o que decide o resultado e, quando nenhum handler está atribuído, a biblioteca retorna AOk, portanto uma aplicação só precisa de um handler para acrescentar regras próprias, não para obter o comportamento correto de cadeia.

O TsgcRTCPeerConnection não é afetado. O WebRTC autentica a outra ponta pelo fingerprint transportado no SDP, e não por uma cadeia de certificados, e deixa VerifyCertificate desabilitado. Essa é a configuração normal do WebRTC e continua funcionando exatamente como antes.

Exemplo

function TForm1.oClientDTLSVerifyPeer(Sender: TObject; Certificate: TIdX509;
  AOk: Boolean; ADepth, AError: Integer): Boolean;
begin
  // start from the verdict OpenSSL already reached
  Result := AOk;
  Memo1.Lines.Add(Format('DTLS peer certificate, depth %d, ok %s, error %d, subject %s',
    [ADepth, BoolToStr(AOk, True), AError, Certificate.Subject.OneLine]));
  // add the rules of the application on top, here the expected name is pinned
  if Result and (ADepth = 0) then
    Result := Pos('/CN=dtls.example.com', Certificate.Subject.OneLine) > 0;
end;

Voltar para Eventos