TsgcUDPCLient › Events › OnDTLSVerifyPeer
Wordt geactiveerd tijdens de DTLS-handshake zodat de applicatie het certificaat van de peer kan inspecteren en accepteren of afwijzen.
property OnDTLSVerifyPeer: TsgcUDPDTLSVerifyPeerEvent;
// TsgcUDPDTLSVerifyPeerEvent = function(Sender: TObject; Certificate: TIdX509; AOk: Boolean; ADepth, AError: Integer): Boolean of object
| Naam | Type | Beschrijving |
|---|---|---|
Sender | TObject | Het component dat de gebeurtenis heeft geactiveerd. |
Certificate | TIdX509 | Het certificaat dat op dit moment wordt geverifieerd. Lees er Subject, Issuer, SerialNumber, notBefore, notAfter of FingerprintAsString uit. Het object is eigendom van de DTLS-engine, het is alleen geldig voor de duur van de aanroep en mag niet door de handler worden vrijgegeven. |
AOk | Boolean | Het oordeel dat OpenSSL al over dit certificaat heeft geveld. True wanneer de ketencontrole en de VerifyDepth-controle zijn geslaagd, False wanneer een van beide is mislukt. Geef deze waarde terug om dat oordeel te respecteren. |
ADepth | Integer | Positie van Certificate in de keten. De gebeurtenis wordt eenmaal per certificaat geactiveerd, 0 is het certificaat van de peer zelf en hogere waarden lopen omhoog richting de root. |
AError | Integer | De OpenSSL-verificatiefoutcode voor dit certificaat (een van de X509_V_ERR_-constanten), 0 wanneer er geen fout is vastgesteld. |
True accepteert het certificaat en laat de handshake doorgaan, False wijst het af en beëindigt de handshake. Dit is de waarde die de uitkomst bepaalt, dus geef AOk terug om het oordeel van OpenSSL te respecteren, en geef False terug voor de certificaten die de applicatie volgens haar eigen regels afwijst. Onvoorwaardelijk True teruggeven verwerpt de ketencontrole en de dieptecontrole, en dat is precies het gedrag dat met deze wijziging uit de bibliotheek is verwijderd. Wanneer er geen handler is toegewezen, geeft de bibliotheek AOk terug, zodat een applicatie alleen een handler nodig heeft om eigen regels toe te voegen, niet om correct ketengedrag te krijgen. (Boolean)
—
Wordt geactiveerd door de DTLS-engine tijdens de handshake wanneer DTLS True is en DTLSOptions.VerifyCertificate is ingeschakeld. Gebruik de gebeurtenis om toepassingsspecifieke validatieregels toe te passen (bijvoorbeeld het pinnen van de verwachte Common Name, het controleren van een aangepast certificaatarchief of het loggen van de certificaatvingerafdruk) bovenop de ketenvalidatie die door OpenSSL wordt uitgevoerd. De handler moet thread-veilig worden geïmplementeerd omdat deze wordt aangeroepen op de DTLS-lezerthread voordat een datagram wordt geaccepteerd.
De ketenvalidatie wordt nu daadwerkelijk afgedwongen. Voorheen werd het door OpenSSL berekende resultaat verworpen, zodat met VerifyCertificate = True elk certificaat werd geaccepteerd, ook een certificaat dat door een niet-vertrouwde autoriteit was uitgegeven. Een certificaat waarvan de keten niet valideert, beëindigt nu de handshake. VerifyCertificate is standaard False, dus noch de ketenvalidatie noch deze gebeurtenis wordt uitgevoerd totdat u ze inschakelt. De waarde die de handler teruggeeft bepaalt de uitkomst, en wanneer er geen handler is toegewezen, geeft de bibliotheek AOk terug, zodat een applicatie alleen een handler nodig heeft om eigen regels toe te voegen, niet om correct ketengedrag te krijgen.
TsgcRTCPeerConnection wordt hier niet door geraakt. WebRTC authenticeert de tegenpartij op basis van de vingerafdruk in de SDP en niet op basis van een certificaatketen, en laat VerifyCertificate uitgeschakeld. Dat is de normale WebRTC-configuratie en die blijft precies werken zoals voorheen.
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;