TsgcUDPCLient › Eventi › OnDTLSVerifyPeer
Viene generato durante l'handshake DTLS affinché l'applicazione possa ispezionare e accettare o rifiutare il certificato del peer.
property OnDTLSVerifyPeer: TsgcUDPDTLSVerifyPeerEvent;
// TsgcUDPDTLSVerifyPeerEvent = function(Sender: TObject; Certificate: TIdX509; AOk: Boolean; ADepth, AError: Integer): Boolean of object
| Nome | Tipo | Descrizione |
|---|---|---|
Sender | TObject | Il componente che ha generato l'evento. |
Certificate | TIdX509 | Il 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. |
AOk | Boolean | Il 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. |
ADepth | Integer | Posizione 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. |
AError | Integer | Il codice di errore di verifica di OpenSSL per questo certificato (una delle costanti X509_V_ERR_), 0 quando non è stato rilevato alcun errore. |
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)
—
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.
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;