TsgcUDPCLient › Zdarzenia › OnDTLSVerifyPeer

OnDTLSVerifyPeer Zdarzenie

Wywoływane podczas uzgadniania DTLS, umożliwiając aplikacji sprawdzenie i zaakceptowanie lub odrzucenie certyfikatu równorzędnego.

Składnia

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

Parametry

NazwaTypOpis
SenderTObjectKomponent, który wywołał zdarzenie.
CertificateTIdX509Aktualnie weryfikowany certyfikat. Można z niego odczytać Subject, Issuer, SerialNumber, notBefore, notAfter lub FingerprintAsString. Obiekt należy do silnika DTLS, jest ważny wyłącznie przez czas trwania wywołania i nie może być zwalniany przez procedurę obsługi.
AOkBooleanWerdykt, do którego OpenSSL już doszedł dla tego certyfikatu. True, gdy sprawdzenie łańcucha i sprawdzenie VerifyDepth zakończyły się powodzeniem, False, gdy któreś z nich zawiodło. Zwróć tę wartość, aby go uszanować.
ADepthIntegerPozycja parametru Certificate w łańcuchu. Zdarzenie jest wywoływane raz dla każdego certyfikatu; 0 to sam certyfikat drugiej strony, a wyższe wartości prowadzą w górę, w stronę certyfikatu głównego.
AErrorIntegerKod błędu weryfikacji OpenSSL dla tego certyfikatu (jedna ze stałych X509_V_ERR_), 0 gdy nie wykryto błędu.

Wartość zwracana

True akceptuje certyfikat i pozwala kontynuować uzgadnianie, False odrzuca go i przerywa uzgadnianie. To ta wartość decyduje o wyniku, więc zwróć AOk, aby uszanować werdykt OpenSSL, i zwróć False dla certyfikatów, które aplikacja odrzuca według własnych reguł. Bezwarunkowe zwracanie True pomija sprawdzenie łańcucha i sprawdzenie głębokości, czyli dokładnie to zachowanie, które zostało usunięte z biblioteki wraz z wprowadzeniem egzekwowania weryfikacji. Gdy żadna procedura obsługi nie jest przypisana, biblioteka zwraca AOk, więc procedura obsługi jest potrzebna wyłącznie po to, aby dodać własne reguły, a nie po to, aby uzyskać poprawne działanie weryfikacji łańcucha. (Boolean)

Wartość domyślna

—

Uwagi

Uruchamiane przez silnik DTLS podczas uzgadniania, gdy DTLS ma wartość True i opcja DTLSOptions.VerifyCertificate jest włączona. Umożliwia zastosowanie reguł weryfikacji specyficznych dla aplikacji (na przykład przypięcie oczekiwanej nazwy pospolitej, sprawdzenie niestandardowego magazynu certyfikatów lub rejestrowanie odcisku certyfikatu) poza weryfikacją łańcucha wykonywaną przez OpenSSL. Procedura obsługi musi być zaimplementowana w sposób bezpieczny wątkowo, ponieważ jest wywoływana w wątku odczytu DTLS przed zaakceptowaniem jakiegokolwiek datagramu.

Weryfikacja łańcucha jest teraz rzeczywiście egzekwowana. Wcześniej wynik obliczony przez OpenSSL był odrzucany, więc przy VerifyCertificate = True akceptowany był dowolny certyfikat, w tym wystawiony przez niezaufany urząd. Certyfikat, którego łańcuch nie przechodzi weryfikacji, przerywa teraz uzgadnianie. VerifyCertificate ma domyślnie wartość False, więc ani weryfikacja łańcucha, ani to zdarzenie nie działają, dopóki jej nie włączysz. O wyniku decyduje wartość zwrócona przez procedurę obsługi, a gdy żadna procedura nie jest przypisana, biblioteka zwraca AOk, więc procedura obsługi jest potrzebna wyłącznie po to, aby dodać własne reguły, a nie po to, aby uzyskać poprawne działanie weryfikacji łańcucha.

Nie dotyczy to TsgcRTCPeerConnection. WebRTC uwierzytelnia drugą stronę na podstawie odcisku przenoszonego w SDP, a nie na podstawie łańcucha certyfikatów, i pozostawia VerifyCertificate wyłączone. Jest to normalna konfiguracja WebRTC i działa dokładnie tak jak dotychczas.

Przykład

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;

Powrót do Zdarzeń