Restaurar la verificación de anulación del certificado SSL

Estoy escribiendo una prueba para probar un servicio que estoy implementando, para omitir la verificación de certificación ssl. Implementé una anulación de SSL utilizando el siguiente fragmento de código:

public static void SSLValidationOverride() { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(OnValidationCallback); } private static bool OnValidationCallback(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors errors) { if (cert.subject == MyCertSubject) return true; else return false; } 

Ahora tengo que llamar a otro servicio web usando ssl en el código y quiero cambiar a la comprobación de ssl predeterminada antes de llamar a eso. ¿Cuál es la mejor manera de hacerlo? La ayuda de MS dice que el valor predeterminado de ServicePointManager.SecurityProtocol es nulo ( http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.securityprotocol.aspx ). Lo establecerá en nulo, cambiará a la validación ssl predeterminada y hay alguna otra forma de hacerlo.

Me he encontrado con un problema similar durante el desarrollo de una herramienta de diagnóstico que he creado. He creado un servicio de Windows que realiza solicitudes a una lista de urls. Para cada url hago una solicitud sin validación de certificado configurando esto:

 ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

y luego, con la misma url, también bash realizar una solicitud con validación de certificado restableciendo la propiedad a cero, lo que debería proporcionar la funcionalidad predeterminada:

 ServicePointManager.ServerCertificateValidationCallback = null; 

Esto ha tenido resultados inesperados, ya que mi solicitud aún se realiza sin validación de certificado como si se hubiera ignorado el restablecimiento. Después de la depuración encontré que si esperaba lo suficiente después de configurar

 ServicePointManager.ServerCertificateValidationCallback = null; 

luego se restableció y mi solicitud se realizó con la validación de certificados predeterminada. así que simplemente puse un sueño durante 30 segundos antes de realizar la solicitud:

 ServicePointManager.ServerCertificateValidationCallback = null; System.Threading.Thread.Sleep(30000); //Make request here 

No entiendo por qué funciona esto, pero funciona y estoy seguro de que hay una mejor manera de hacerlo y, si sabe cómo, hágamelo saber.

Terminé configurando ServicePointManager.SecurityProtocol en nulo y funciona bien. Aunque todavía estoy abierto a mejores formas de hacer esto

 public static void SSLValidationRestore() { ServicePointManager.ServerCertificateValidationCallback = null; } 

Establecer la callback en nulo no funciona. En su lugar, todos los certificados pasan. No entiendo por qué tantas personas han publicado la configuración del valor en null works o – = works. Tampoco el trabajo … al menos en 3.5. Después de otras pruebas, parece que la comprobación simplemente se almacena en caché. Volver a verificar una vez que el certificado ha sido validado una vez no provoca la devolución de la llamada.

Me encontré con un problema similar. En lugar de llamar a Thread.Sleep () en la solución @Acode Monkey, puede cambiar el ServicePointManager.MaxServicePointIdleTime a un valor bajo.

 ServicePointManager.MaxServicePointIdleTime = 1;