Evite errores de certificados SSL no válidos al llamar a servicios web en.Net
web-services sharepoint (8)
Alternativamente, puede registrar un delegado de devolución de llamada que ignora el error de certificación:
...
ServicePointManager.ServerCertificateValidationCallback = MyCertHandler;
...
static bool MyCertHandler(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors error)
{
// Ignore errors
return true;
}
Estamos configurando un nuevo SharePoint para el cual todavía no tenemos un certificado SSL válido. Me gustaría llamar al servicio web Listas para recuperar algunos metadatos sobre la configuración. Sin embargo, cuando trato de hacer esto, obtengo la excepción:
La conexión subyacente se cerró: no se pudo establecer una relación de confianza para el canal seguro SSL / TLS.
La excepción anidada contiene el mensaje de error:
El certificado remoto no es válido de acuerdo con el procedimiento de validación.
Esto es correcto ya que estamos usando un certificado temporal.
Mi pregunta es: ¿cómo puedo decirle al cliente del servicio web .Net ( SoapHttpClientProtocol ) que ignore estos errores?
Como la respuesta de Jason S:
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
Puse esto en mi Main y busco en mi app.config
y app.config
si (ConfigurationManager.AppSettings["IgnoreSSLCertificates"] == "True")
antes de llamar a esa línea de código.
El enfoque que utilicé al enfrentar este problema fue agregar al firmante del certificado temporal a la lista de autoridades de confianza en la computadora en cuestión.
Normalmente hago pruebas con certificados creados con CACERT, y agregarlos a mi lista de autoridades confiables funcionó a la perfección.
Hacerlo de esta manera significa que no tiene que agregar ningún código personalizado a su aplicación y simula correctamente lo que sucederá cuando se implemente su aplicación. Como tal, creo que esta es una solución superior para desactivar el control mediante programación.
Estaba teniendo el mismo error al usar DownloadString; y fue capaz de hacer que funcione de la siguiente manera con sugerencias en esta página
System.Net.WebClient client = new System.Net.WebClient();
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
string sHttpResonse = client.DownloadString(sUrl);
Lo solucioné de esta manera:
Llame lo siguiente justo antes de llamar a su servicio web ssl que causa ese error:
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
/// <summary>
/// solution for exception
/// System.Net.WebException:
/// The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.
/// </summary>
public static void BypassCertificateError()
{
ServicePointManager.ServerCertificateValidationCallback +=
delegate(
Object sender1,
X509Certificate certificate,
X509Chain chain,
SslPolicyErrors sslPolicyErrors)
{
return true;
};
}
Para ampliar aún más la publicación de Simon Johnsons: lo ideal es que quieras una solución que simule las condiciones que verás en la producción y modificar tu código no hará eso y podría ser peligroso si te olvidas de sacar el código antes de desplegarlo.
Necesitará un certificado autofirmado de algún tipo. Si está utilizando IIS Express ya tendrá uno de estos, solo tendrá que encontrarlo. Abra Firefox o el navegador que desee e ingrese a su sitio web de desarrollo. Debería poder ver la información del certificado desde la barra de URL y, dependiendo de su navegador, debería poder exportar el certificado a un archivo.
A continuación, abra MMC.exe y agregue el complemento Certificado. Importe su archivo de certificado en la tienda Autoridades de certificación de raíz de confianza y eso es todo lo que necesita. Es importante asegurarse de que vaya a esa tienda y no a otra tienda como ''Personal''. Si no está familiarizado con MMC o certificados, hay numerosos sitios web con información sobre cómo hacer esto.
Ahora, su computadora como un todo confiará implícitamente en cualquier certificado que se haya generado y no necesitará agregar código para manejar esto especialmente. Cuando pase a producción, continuará funcionando siempre que tenga un certificado válido instalado allí. No haga esto en un servidor de producción; sería malo y no funcionaría para ningún otro cliente que no sea el servidor.
Para los novatos, puede ampliar su clase de servicio parcial en un archivo cs separado y agregar el código del código proporcionado por "imanabidi" para integrarlo
ServicePointManager.ServerCertificateValidationCallback +=
(mender, certificate, chain, sslPolicyErrors) => true;
omitirá invaild ssl. Escríbelo en el constructor de tu servicio web.