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.