TsgcUDPCLient › Olaylar › OnDTLSVerifyPeer
DTLS handshake'i sırasında tetiklenir, böylece uygulama peer sertifikasını inceleyebilir ve kabul edebilir veya reddedebilir.
property OnDTLSVerifyPeer: TsgcUDPDTLSVerifyPeerEvent;
// TsgcUDPDTLSVerifyPeerEvent = function(Sender: TObject; Certificate: TIdX509; AOk: Boolean; ADepth, AError: Integer): Boolean of object
| Name | Type | Açıklama |
|---|---|---|
Sender | TObject | Olayı tetikleyen bileşen. |
Certificate | TIdX509 | O anda doğrulanmakta olan sertifika. Subject, Issuer, SerialNumber, notBefore, notAfter veya FingerprintAsString değerlerini bu nesneden okuyun. Nesne DTLS motoruna aittir, yalnızca çağrı süresince geçerlidir ve işleyici tarafından serbest bırakılmamalıdır. |
AOk | Boolean | OpenSSL'in bu sertifika için halihazırda ulaştığı karar. Zincir denetimi ve VerifyDepth denetimi geçtiğinde True, ikisinden biri başarısız olduğunda False olur. Bu karara uymak için değeri olduğu gibi döndürün. |
ADepth | Integer | Certificate'ın zincirdeki konumu. Olay her sertifika için bir kez tetiklenir; 0 eşin kendi sertifikasıdır ve daha büyük değerler köke doğru ilerler. |
AError | Integer | Bu sertifika için OpenSSL doğrulama hata kodu (X509_V_ERR_ sabitlerinden biri); hata algılanmadığında 0 olur. |
True sertifikayı kabul eder ve handshake'in sürmesine izin verir, False ise sertifikayı reddeder ve handshake'i sonlandırır. Sonucu belirleyen değer budur; bu nedenle OpenSSL'in kararına uymak için AOk döndürün ve uygulamanın kendi kurallarına göre reddettiği sertifikalar için False döndürün. Koşulsuz olarak True döndürmek zincir denetimini ve derinlik denetimini geçersiz kılar; bu da tam olarak kütüphaneden kaldırılan davranıştır. Hiçbir işleyici atanmadığında kütüphane AOk döndürür; bu nedenle bir uygulamanın işleyiciye yalnızca kendi kurallarını eklemek için ihtiyacı vardır, doğru zincir davranışını elde etmek için değil. (Boolean)
—
DTLS True olduğunda ve DTLSOptions.VerifyCertificate etkinleştirildiğinde, handshake sırasında DTLS motoru tarafından tetiklenir. Olayı, OpenSSL tarafından gerçekleştirilen zincir doğrulamasının üzerine uygulamaya özel doğrulama kuralları (örneğin, beklenen Common Name'i sabitlemek, özel bir sertifika deposunu kontrol etmek veya sertifika parmak izini günlüğe kaydetmek) uygulamak için kullanın. İşleyici, herhangi bir datagram kabul edilmeden önce DTLS okuyucu iş parçacığında çağrıldığından, iş parçacığı güvenli bir şekilde uygulanmalıdır.
Zincir doğrulaması artık gerçekten zorunlu kılınıyor. Daha önce OpenSSL tarafından hesaplanan sonuç atılıyordu; bu nedenle VerifyCertificate = True iken, güvenilmeyen bir makam tarafından düzenlenmiş olanlar dahil her sertifika kabul ediliyordu. Zinciri doğrulanamayan bir sertifika artık handshake'i sonlandırır. VerifyCertificate varsayılan olarak False'tur; bu nedenle siz etkinleştirene kadar ne zincir doğrulaması ne de bu olay çalışır. Sonucu belirleyen değer, işleyicinin döndürdüğü değerdir ve hiçbir işleyici atanmadığında kütüphane AOk döndürür; bu nedenle bir uygulamanın işleyiciye yalnızca kendi kurallarını eklemek için ihtiyacı vardır, doğru zincir davranışını elde etmek için değil.
TsgcRTCPeerConnection bundan etkilenmez. WebRTC, karşı tarafın kimliğini bir sertifika zinciriyle değil, SDP içinde taşınan parmak iziyle doğrular ve VerifyCertificate'ı kapalı bırakır. Bu, normal WebRTC yapılandırmasıdır ve tam olarak eskisi gibi çalışmaya devam eder.
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;