TsgcUDPCLient › Événements › OnDTLSVerifyPeer

OnDTLSVerifyPeer Événement

Se déclenche lors du handshake DTLS afin que l'application puisse inspecter et accepter ou rejeter le certificat du pair.

Syntaxe

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

Paramètres

NomTypeDescription
SenderTObjectLe composant qui a déclenché l'événement.
CertificateTIdX509Le certificat en cours de vérification. Vous pouvez y lire Subject, Issuer, SerialNumber, notBefore, notAfter ou FingerprintAsString. L'objet appartient au moteur DTLS, il n'est valide que pendant la durée de l'appel et ne doit pas être libéré par le gestionnaire.
AOkBooleanLe verdict auquel OpenSSL est déjà parvenu pour ce certificat. True lorsque le contrôle de la chaîne et le contrôle de VerifyDepth ont réussi, False lorsque l'un des deux a échoué. Renvoyez cette valeur pour le respecter.
ADepthIntegerPosition de Certificate dans la chaîne. L'événement est déclenché une fois par certificat, 0 correspond au certificat du pair lui-même et les valeurs supérieures remontent vers la racine.
AErrorIntegerLe code d'erreur de vérification OpenSSL pour ce certificat (l'une des constantes X509_V_ERR_), 0 lorsqu'aucune erreur n'a été détectée.

Valeur de retour

True accepte le certificat et laisse la négociation se poursuivre, False le rejette et met fin à la négociation. C'est cette valeur qui détermine le résultat : renvoyez AOk pour respecter le verdict d'OpenSSL, et renvoyez False pour les certificats que l'application rejette selon ses propres règles. Renvoyer True sans condition annule le contrôle de la chaîne et le contrôle de profondeur, c'est-à-dire exactement le comportement que la mise en application de la vérification a supprimé de la bibliothèque. Lorsqu'aucun gestionnaire n'est affecté, la bibliothèque renvoie AOk : une application n'a donc besoin d'un gestionnaire que pour ajouter ses propres règles, pas pour obtenir un comportement de chaîne correct. (Boolean)

Valeur par défaut

—

Remarques

Déclenché par le moteur DTLS lors de la négociation lorsque DTLS est True et que DTLSOptions.VerifyCertificate est activé. Utilisez l'événement pour appliquer des règles de validation spécifiques à l'application (par exemple, vérifier le Common Name attendu, contrôler un magasin de certificats personnalisé ou enregistrer l'empreinte du certificat) en plus de la validation de la chaîne effectuée par OpenSSL. Le gestionnaire doit être implémenté de manière thread-safe car il est invoqué sur le thread de lecture DTLS avant qu'un datagramme ne soit accepté.

La validation de la chaîne est désormais réellement appliquée. Auparavant, le résultat calculé par OpenSSL était ignoré : avec VerifyCertificate = True, n'importe quel certificat était accepté, y compris un certificat émis par une autorité non fiable. Un certificat dont la chaîne échoue à la vérification met désormais fin à la négociation. VerifyCertificate vaut False par défaut, ni la validation de la chaîne ni cet événement ne s'exécutent donc tant que vous ne l'avez pas activé. C'est la valeur renvoyée par le gestionnaire qui détermine le résultat et, lorsqu'aucun gestionnaire n'est affecté, la bibliothèque renvoie AOk : une application n'a donc besoin d'un gestionnaire que pour ajouter ses propres règles, pas pour obtenir un comportement de chaîne correct.

TsgcRTCPeerConnection n'est pas concerné. WebRTC authentifie l'autre extrémité par l'empreinte transportée dans le SDP, et non par une chaîne de certificats, et laisse VerifyCertificate désactivé. C'est la configuration WebRTC normale et elle continue de fonctionner exactement comme auparavant.

Exemple

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;

Retour aux événements