TsgcUDPCLient › Eventi › OnDTLSVerifyPeer

OnDTLSVerifyPeer Event

Viene generato durante l'handshake DTLS affinché l'applicazione possa ispezionare e accettare o rifiutare il certificato del peer.

Sintassi

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

Parametri

NomeTipoDescrizione
SenderTObjectIl componente che ha generato l'evento.
CertificateTIdX509Il certificato attualmente in verifica. Da esso si possono leggere Subject, Issuer, SerialNumber, notBefore, notAfter o FingerprintAsString. L'oggetto appartiene al motore DTLS, è valido solo per la durata della chiamata e non deve essere liberato dal gestore.
AOkBooleanIl verdetto già raggiunto da OpenSSL per questo certificato. True quando il controllo della catena e il controllo di VerifyDepth sono stati superati, False quando uno dei due è fallito. Restituire questo valore per rispettarlo.
ADepthIntegerPosizione di Certificate nella catena. L'evento viene generato una volta per ogni certificato: 0 è il certificato del peer stesso e i valori più alti risalgono verso la radice.
AErrorIntegerIl codice di errore di verifica di OpenSSL per questo certificato (una delle costanti X509_V_ERR_), 0 quando non è stato rilevato alcun errore.

Valore restituito

True accetta il certificato e lascia proseguire l'handshake, False lo rifiuta e termina l'handshake. È questo il valore che decide l'esito, quindi restituire AOk per rispettare il verdetto di OpenSSL e restituire False per i certificati che l'applicazione rifiuta in base a regole proprie. Restituire sempre True annulla il controllo della catena e il controllo della profondità, che è esattamente il comportamento eliminato dalla libreria con questa modifica. Quando non è assegnato alcun gestore la libreria restituisce AOk, quindi un'applicazione ha bisogno di un gestore solo per aggiungere regole proprie, non per ottenere un comportamento corretto della catena. (Boolean)

Valore predefinito

—

Note

Viene attivato dal motore DTLS durante l'handshake quando DTLS è True e DTLSOptions.VerifyCertificate è abilitato. Utilizzare l'evento per applicare regole di validazione specifiche dell'applicazione (ad esempio, verificare il Common Name atteso, controllare un archivio certificati personalizzato o registrare l'impronta del certificato) oltre alla validazione della catena eseguita da OpenSSL. Il gestore deve essere implementato in modo thread-safe poiché viene invocato sul thread di lettura DTLS prima che venga accettato qualsiasi datagramma.

La validazione della catena è ora effettivamente applicata. In precedenza il risultato calcolato da OpenSSL veniva scartato, quindi con VerifyCertificate = True veniva accettato qualsiasi certificato, compreso uno emesso da un'autorità non attendibile. Un certificato la cui catena non risulta valida ora termina l'handshake. VerifyCertificate è False per impostazione predefinita, quindi né la validazione della catena né questo evento entrano in funzione finché non viene attivato. Il valore restituito dal gestore è ciò che decide l'esito e, quando non è assegnato alcun gestore, la libreria restituisce AOk, quindi un'applicazione ha bisogno di un gestore solo per aggiungere regole proprie, non per ottenere un comportamento corretto della catena.

TsgcRTCPeerConnection non è interessato. WebRTC autentica l'altro estremo tramite l'impronta trasportata nell'SDP e non tramite una catena di certificati, e lascia VerifyCertificate disabilitato. Questa è la configurazione WebRTC normale e continua a funzionare esattamente come prima.

Esempio

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;

Torna agli Eventi