TsgcUDPCLient › Ereignisse › OnDTLSVerifyPeer

OnDTLSVerifyPeer Ereignis

Wird während des DTLS-Handshakes ausgelöst, sodass die Anwendung das Peer-Zertifikat inspizieren und akzeptieren oder ablehnen kann.

Syntax

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

Parameter

NameTypBeschreibung
SenderTObjectDie Komponente, die das Ereignis ausgelöst hat.
CertificateTIdX509Das gerade überprüfte Zertifikat. Lesen Sie daraus Subject, Issuer, SerialNumber, notBefore, notAfter oder FingerprintAsString. Das Objekt gehört der DTLS-Engine, es ist nur für die Dauer des Aufrufs gültig und darf vom Handler nicht freigegeben werden.
AOkBooleanDas Urteil, zu dem OpenSSL für dieses Zertifikat bereits gekommen ist. True, wenn die Kettenprüfung und die VerifyDepth-Prüfung bestanden wurden, False, wenn eine von beiden fehlgeschlagen ist. Geben Sie diesen Wert zurück, um ihn zu übernehmen.
ADepthIntegerPosition von Certificate in der Kette. Das Ereignis wird einmal pro Zertifikat ausgelöst, 0 ist das Peer-Zertifikat selbst, höhere Werte gehen in Richtung Wurzel.
AErrorIntegerDer OpenSSL-Fehlercode der Überprüfung für dieses Zertifikat (eine der X509_V_ERR_-Konstanten), 0, wenn kein Fehler festgestellt wurde.

Rückgabewert

True akzeptiert das Zertifikat und lässt den Handshake fortfahren, False lehnt es ab und beendet den Handshake. Dieser Wert entscheidet über das Ergebnis, geben Sie daher AOk zurück, um das Urteil von OpenSSL zu übernehmen, und geben Sie False für die Zertifikate zurück, die die Anwendung nach eigenen Regeln ablehnt. Bedingungsloses Zurückgeben von True verwirft die Kettenprüfung und die Tiefenprüfung, also genau das Verhalten, das die Durchsetzungsänderung aus der Bibliothek entfernt hat. Ist kein Handler zugewiesen, gibt die Bibliothek AOk zurück, eine Anwendung benötigt einen Handler also nur, um eigene Regeln hinzuzufügen, nicht um korrektes Kettenverhalten zu erhalten. (Boolean)

Standardwert

—

Hinweise

Wird von der DTLS-Engine während des Handshakes ausgelöst, wenn DTLS True ist und DTLSOptions.VerifyCertificate aktiviert ist. Verwenden Sie das Ereignis, um anwendungsspezifische Validierungsregeln anzuwenden (zum Beispiel das Pinnen des erwarteten Common Name, das Prüfen eines benutzerdefinierten Zertifikatspeichers oder das Protokollieren des Zertifikat-Fingerabdrucks) aufbauend auf der von OpenSSL durchgeführten Kettenvalidierung. Der Handler muss threadsicher implementiert sein, da er auf dem DTLS-Reader-Thread aufgerufen wird, bevor ein Datagramm akzeptiert wird.

Die Kettenvalidierung wird jetzt tatsächlich durchgesetzt. Bisher wurde das von OpenSSL berechnete Ergebnis verworfen, sodass mit VerifyCertificate = True jedes Zertifikat akzeptiert wurde, auch eines, das von einer nicht vertrauenswürdigen Zertifizierungsstelle ausgestellt wurde. Ein Zertifikat, dessen Kette nicht überprüft werden kann, beendet jetzt den Handshake. VerifyCertificate ist standardmäßig False, weder die Kettenvalidierung noch dieses Ereignis laufen also, bevor Sie es einschalten. Der vom Handler zurückgegebene Wert entscheidet über das Ergebnis, und ist kein Handler zugewiesen, gibt die Bibliothek AOk zurück, eine Anwendung benötigt einen Handler also nur, um eigene Regeln hinzuzufügen, nicht um korrektes Kettenverhalten zu erhalten.

TsgcRTCPeerConnection ist nicht betroffen. WebRTC authentifiziert die Gegenstelle über den im SDP übertragenen Fingerabdruck und nicht über eine Zertifikatskette und lässt VerifyCertificate deaktiviert. Das ist die normale WebRTC-Konfiguration und sie funktioniert genau wie bisher.

Beispiel

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;

Zurück zu Ereignissen