TsgcUDPCLient › Eventos › OnDTLSVerifyPeer

OnDTLSVerifyPeer Evento

Se activa durante el protocolo de enlace DTLS para que la aplicación pueda inspeccionar y aceptar o rechazar el certificado del par.

Sintaxis

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

Parámetros

NombreTipoDescripción
SenderTObjectEl componente que activó el evento.
CertificateTIdX509El certificado que se está verificando en ese momento. Lea de él Subject, Issuer, SerialNumber, notBefore, notAfter o FingerprintAsString. El objeto pertenece al motor DTLS, solo es válido mientras dura la llamada y el manejador no debe liberarlo.
AOkBooleanEl veredicto al que ya ha llegado OpenSSL para este certificado. True cuando la comprobación de la cadena y la comprobación de VerifyDepth han pasado, False cuando ha fallado alguna de las dos. Devuelva este valor para respetarlo.
ADepthIntegerPosición de Certificate en la cadena. El evento se activa una vez por cada certificado, 0 es el certificado del par y los valores superiores ascienden hacia la raíz.
AErrorIntegerCódigo de error de verificación de OpenSSL para este certificado (una de las constantes X509_V_ERR_), 0 cuando no se ha detectado ningún error.

Valor de Retorno

True acepta el certificado y permite que el protocolo de enlace continúe, False lo rechaza y termina el protocolo de enlace. Este es el valor que decide el resultado, así que devuelva AOk para respetar el veredicto de OpenSSL y devuelva False para los certificados que la aplicación rechace según sus propias reglas. Devolver True incondicionalmente descarta la comprobación de la cadena y la comprobación de profundidad, que es exactamente el comportamiento que se eliminó de la biblioteca al pasar a aplicar la verificación. Cuando no hay ningún manejador asignado, la biblioteca devuelve AOk, de modo que una aplicación solo necesita un manejador para añadir reglas propias, no para obtener un comportamiento de cadena correcto. (Boolean)

Valor Predeterminado

—

Observaciones

Disparado por el motor DTLS durante el protocolo de enlace cuando DTLS es True y DTLSOptions.VerifyCertificate está habilitado. Utilice el evento para aplicar reglas de validación específicas de la aplicación (por ejemplo, fijar el Common Name esperado, comprobar un almacén de certificados personalizado o registrar la huella del certificado) sobre la validación de cadena realizada por OpenSSL. El manejador debe implementarse de forma segura para subprocesos, ya que se invoca en el hilo lector DTLS antes de que se acepte cualquier datagrama.

La validación de la cadena ahora se aplica de verdad. Anteriormente, el resultado calculado por OpenSSL se descartaba, por lo que con VerifyCertificate = True se aceptaba cualquier certificado, incluido uno emitido por una autoridad no confiable. Un certificado cuya cadena no se verifica termina ahora el protocolo de enlace. VerifyCertificate es False de forma predeterminada, así que ni la validación de la cadena ni este evento se ejecutan hasta que lo habilite. El valor devuelto por el manejador es lo que decide el resultado y, cuando no hay ningún manejador asignado, la biblioteca devuelve AOk, de modo que una aplicación solo necesita un manejador para añadir reglas propias, no para obtener un comportamiento de cadena correcto.

TsgcRTCPeerConnection no se ve afectado. WebRTC autentica al otro extremo mediante la huella digital transportada en el SDP, no mediante una cadena de certificados, y deja VerifyCertificate deshabilitado. Esa es la configuración WebRTC habitual y sigue funcionando exactamente igual que antes.

Ejemplo

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;

Volver a Eventos