Al hacer una llamada a un servicio web que se ejecuta en un servidor mediante HTTPS mi solicitud tiros un System.NET.WebException con el mensaje "La conexión subyacente se cerró: ¿Podría no establecer una relación de confianza con el servidor remoto ". No estoy seguro de cómo solucionar este problema y hacer la llamada con éxito.System.NET.WebException arrojado al consumir un servicio web a través de HTTPS
Respuesta
Después de algunas investigaciones, encontré un artículo del blog de Jan Tielens que explica lo que está ocurriendo y una solución para mi problema:
Cuando navega a un sitio HTTPS, es probable que obtener una ventana de diálogo que le pregunta si desea confiar en el certificado proporcionado por el servidor web. Por lo tanto, el usuario maneja la responsabilidad de aceptar el certificado. Regresemos al escenario del servicio web, si desea invocar un servicio web ubicado en un servidor web que utiliza SSL y HTTPS, existe un problema. Cuando realiza la llamada desde el código, no hay ventana de diálogo que se levante, y preguntando si confía en el certificado (por suerte, porque esto sería bastante feo en los escenarios del lado del servidor); probablemente obtendrá siguiente excepción:
Una excepción no controlada del tipo
System.Net.WebException
se produjo en System.dll
Información adicional: El conexión subyacente se cerró: No se pudo establecer relación de confianza con servidor remoto.Pero hay una solución para este problema , puede resolver esto en su código mediante la creación de su propio
CertificatePolicy
clase (que implementa la interfazICertificatePolicy
). En esta clase usted tiene que escribir su propia funciónCheckValidationResult
que tiene que volvertrue
ofalse
, al igual que presionaría sí o no en el ventana de diálogo. Para los propósitos de desarrollo que he creado la siguiente clase que acepta todos los certificados, por lo que no voy a conseguir el desagradableWebException
más:
public class TrustAllCertificatePolicy : System.Net.ICertificatePolicy
{
public TrustAllCertificatePolicy() { }
public bool CheckValidationResult(ServicePoint sp, X509Certificate cert, WebRequest req, int problem)
{
return true;
}
}
Como se puede ver la función
CheckValidationResult
siempre devuelve true, por lo que todos los certificados serán confiables. Si desea hacer esta clase un poco más seguro, puede agregar comprobaciones adicionales usando el parámetroX509Certificate
por ejemplo. Para utilizar estaCertificatePolicy
, podrás tiene que decirle alServicePointManager
utilizarlo:
System.Net.ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();
Esto se debe hacer (una vez durante el ciclo de vida de aplicaciones ) antes de hacer la llamada a su servicio web
Si está utilizando un certificado SSL autofirmado o un certificado SSL no confiable, puede indicarle a su aplicación que lo ignore (si realmente desea ignorarlo). p.ej.
ServicePointManager.ServerCertificateValidationCallback = _
new RemoteCertificateValidationCallback(IgnoreSelfSSL)
public bool IgnoreSelfSSL(ServicePoint sp, X509Certificate cert,WebRequest req, int problem) {
return true;
}
Puede colocar la devolución de llamada en cualquier lugar que se golpee antes de ejecutar su llamada de servicio.
Las sugerencias dadas en las respuestas se deben usar solo para probar. Para la aceptación/producción, debe tener el certificado WS instalado en la máquina que realiza la llamada a WS, y realizar la validación del certificado antes de llamar a WS: caducidad, asunto, etc. Luego puede agregar este certificado a la solicitud de WS a través del SoapHttpClientProtocol.Proxy.ClientCertificates.
- 1. consumir servicio web SOAP
- 2. ¿Cómo consumir un servicio SOAP sobre HTTPS en C#?
- 3. Consumir un servicio web REST XML
- 4. Consumir un servicio web usando Javascript
- 5. Consumir el servicio web SOAP en ASP.NET
- 6. ¿Cómo consumir el servicio web WCF a través de la URL en tiempo de ejecución?
- 7. consumir servicio web SOAP utilizando jquery
- 8. servicio de Windows alojado WCF a través de HTTPS
- 9. Consumir servicio web desde un archivo DLL .NET - app.config problema
- 10. ¿Se puede consumir un servicio WCF como si fuera un servicio web ASP.NET?
- 11. java.security.PrivilegedActionException mientras que golpea servicios web a través de HTTPS
- 12. Cómo consumir un servicio web ColdFusion con dotnet
- 13. ¿Cómo puede Excel 2007/2010 consumir un servicio web REST?
- 14. "CURLE_OUT_OF_MEMORY" error al publicar a través de https
- 15. Consumir un servicio web utilizando una interfaz diferente
- 16. Cómo consumir fácilmente un servicio web desde PHP
- 17. Cómo consumir un servicio web RESTful en Lotus Notes
- 18. ¿Cómo transferir un java.util.Map a través de un servicio web?
- 19. ¿Cómo consumir el servicio web RESTful en mi proyecto JSF?
- 20. AJAX entre dominios usando jsonp y el servicio web .NET a través de SSL/HTTPS
- 21. ¿Transfiriendo datos binarios a través de un servicio web SOAP?
- 22. Bugzilla - servicio web a través de JSON-RPC
- 23. Servicio web de SAP desde .NET a través de WCF
- 24. en R, ¿cómo puedo llamar a un servicio web si tengo una descripción de WSDL? (Consumir servicios web)
- 25. Al pasar un objeto de excepción a un servicio web
- 26. Escribiendo un cliente C# para consumir un servicio web Java que devuelve una matriz de objetos
- 27. ¿Cómo consumir un servicio relajante en .NET?
- 28. http to https a través de .htaccess
- 29. Consumir un servicio web a través de un servidor proxy de Internet, utilizando un cliente WCF en C#; proporcionar autenticación de servidor proxy
- 30. Enviar un archivo pdf al cliente desde el servidor a través del servicio web
¿Puede acceder a la URL a través de un navegador? Si es así, ¿el navegador le advierte que el certificado no es válido? – dlev