TsgcUDPCLient › Ereignisse › OnDTLSVerifyPeer
Wird während des DTLS-Handshakes ausgelöst, sodass die Anwendung das Peer-Zertifikat inspizieren und akzeptieren oder ablehnen kann.
property OnDTLSVerifyPeer: TsgcUDPDTLSVerifyPeerEvent;
// TsgcUDPDTLSVerifyPeerEvent = function(Sender: TObject; Certificate: TIdX509; AOk: Boolean; ADepth, AError: Integer): Boolean of object
| Name | Typ | Beschreibung |
|---|---|---|
Sender | TObject | Die Komponente, die das Ereignis ausgelöst hat. |
Certificate | TIdX509 | Das 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. |
AOk | Boolean | Das 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. |
ADepth | Integer | Position 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. |
AError | Integer | Der OpenSSL-Fehlercode der Überprüfung für dieses Zertifikat (eine der X509_V_ERR_-Konstanten), 0, wenn kein Fehler festgestellt wurde. |
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)
—
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.
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;