Saltar al contenido

¿Cómo configuro la propiedad ‘ServerCertificateValidationCallback’ a su comportamiento predeterminado?

Basta ya de indagar en otras webs porque llegaste al espacio adecuado, poseemos la solución que deseas pero sin complicarte.

Solución:

Esto realmente parece funcionar (tan simple como es) y hace que el objeto se comporte de la manera predeterminada.

ServicePointManager.ServerCertificateValidationCallback = Nothing

Sólo querrás volver true para ciertas URL, pero por lo demás, esto hace lo que quiere, dejando la posibilidad de usar múltiples delegados. La lógica para cada devolución de llamada podría incluir una verificación a través de la reflexión para que la devolución de llamada solo devuelva true cuando se llama desde ciertos componentes, creando así una especie de túnel entre ciertas URL y ciertas aplicaciones.

Una forma de usar este código: 1. Defina el delegado mIgnoreBadCertificates al principio de la vida de su objeto 2. Establezca una propiedad que contenga el código ‘beSecure’ true
3. Envíe la solicitud Http. 4. Establecer la propiedad false. Esto es muy importante y debe implementarse de una manera que garantice que se llame. El patrón IDisposable es una opción.

 private System.Net.Security.RemoteCertificateValidationCallback mIgnoreBadCertificates = new
    System.Net.Security.RemoteCertificateValidationCallback(
      delegate  return true; );

if (beSecure)
       //require secure communications
        System.Net.ServicePointManager.ServerCertificateValidationCallback -= mIgnoreBadCertificates;
        Iwds.EventLogger.LogVeryFrequentEvent("Requiring Good Certificates from Remote Sites");
    
    else
       /// Allow connections to SSL sites that have unsafe certificates.
        System.Net.ServicePointManager.ServerCertificateValidationCallback += mIgnoreBadCertificates;
        Iwds.EventLogger.LogVeryFrequentEvent("Ignoring Bad Certificates from Remote Sites");
    

A key punto para resolver su problema es el hecho de que el sender parámetro a la RemoteCertificateValidationCallback es el WebRequest. Puede verificar el remitente con su solicitud web para que solo verifique su solicitud web. Aquí está mi solución (relativamente no probada):

// Main Code

request = (FtpWebRequest)FtpWebRequest.Create("ftp://example.com");

using(var validator = new WebRequestCertificateValidator(request))

    // etc...


// WebRequestCertificateValidator Class

public sealed class WebRequestCertificateValidator : IDisposable

    private bool disposed;

    private WebRequest request;

    private RemoteCertificateValidationCallback callback;

    /// 
    /// Creates a certificate validator that allows all certificates for the supplied web request.
    /// 
    /// The WebRequest to validate for.
    public WebRequestCertificateValidator(WebRequest request) : this(request, null)
    
        //
    

    /// 
    /// Creates a certificate validator that only allows certificates for the supplied web request of the callback returns true.
    /// 
    /// The WebRequest to validate for.
    /// The delegate that will be called to validate certificates for the WebRequest.
    public WebRequestCertificateValidator(WebRequest request, RemoteCertificateValidationCallback callback)
    
        this.disposed = false;

        this.request = request;

        this.callback = callback;

        ServicePointManager.ServerCertificateValidationCallback += this.InternalCallback;
    

    private bool InternalCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    
        WebRequest request = sender as WebRequest;

        if(request != null)
        
            if(request == this.request)
            
                if(this.callback != null)
                
                    return this.callback(sender, certificate, chain, sslPolicyErrors);
                
            
        

        return true;
    

    public void Dispose()
    
        if(!this.disposed)
        
            ServicePointManager.ServerCertificateValidationCallback -= this.InternalCallback;

            this.callback = null;

            this.request = null;

            this.disposed = true;
        
    

Comentarios y calificaciones

Si te gustó nuestro trabajo, eres capaz de dejar un artículo acerca de qué te ha gustado de este post.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *