Author Topic: Consumir Web Service Java por Canal HTTPS desde .Net  (Read 10128 times)

eduar2083

  • Full Member
  • ***
  • Posts: 103
  • Karma: 0
    • View Profile
Consumir Web Service Java por Canal HTTPS desde .Net
« on: Junio 13, 2014, 08:51:31 am »
Buenas tardes,

Tengo una url de un servicio web implementado en Java alojado en un servidor weblogic. La url es como: https://servidor.com?WSDL

He creado un Web Reference en mi aplicación Asp.Net para consumir dicho servicio, pero al momento de invocar a un método del WebService, me lanza una excepción:

Caso 1:
Code: [Select]
WebException: The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel
Caso 2:
Investigando un poco me recomendaron agregar la siguiente linea para ignorar el certificado:
Code: [Select]
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };Pero me sigue arrojando una excepción aunque diferente:
Code: [Select]
SoapHeaderException: Soap Header Security was not understood
Ya llevo buen rato atascado con esto, favor solicito su apoyo.

Muchas gracias.
Saludos cordiales.

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5466
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Consumir Web Service Java por Canal HTTPS desde .Net
« Reply #1 on: Junio 13, 2014, 11:25:35 am »
¿Dónde da esa excepción? ¿En java o en .net?

Se bueno.

eduar2083

  • Full Member
  • ***
  • Posts: 103
  • Karma: 0
    • View Profile
Re: Consumir Web Service Java por Canal HTTPS desde .Net
« Reply #2 on: Junio 13, 2014, 11:43:16 am »
En .Net Chuidiang, ojalá pudieras ayudarme.

Gracias.

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5466
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Consumir Web Service Java por Canal HTTPS desde .Net
« Reply #3 on: Junio 13, 2014, 02:50:01 pm »
Lo muevo entonces a .net. No puedo ayudarte, no conozco .net

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5466
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Consumir Web Service Java por Canal HTTPS desde .Net
« Reply #4 on: Junio 13, 2014, 03:58:12 pm »
Si fuera parecido a java, cuando haces un cliente java que se conecta a un https (web service o lo que sea), el certificado que presenta el servidor hay que meterlo en un directorio especial de java para que lo entienda como certificado de confianza, si no, no se conectará. Puedes mirar si en .NET es similar, si hay un sitio o código a hacer para que un cliente acepte como de confianza el certificado que le presenta el servidor.

Se bueno.

eduar2083

  • Full Member
  • ***
  • Posts: 103
  • Karma: 0
    • View Profile
Re: Consumir Web Service Java por Canal HTTPS desde .Net
« Reply #5 on: Junio 13, 2014, 11:19:40 pm »
Gracias Chuidiang por responder.
Imagino que debe ser la misma lógica. Pregunto, en el caso de Java, suponiendo que el Web Service está alojado en un servidor X y que la aplicación Web que consume dicho servicio está alojada en un servidor Y.... ¿el certificado debe encontrase instalado en ambos servidores o sólo en el que contiene el servicio web? Te comento esto porque cuando yo pego la url del servicio en el navegador Internet Explorer, salta un error de certificado pero al continuar, he logrado obtener un archivo con extensión .cer que imagino es el certificado alojado en el servidor del Web Service. Estaba pensando que talvez sea este el certificado que debo referenciar desde el código C#. Otra pregunta, en el caso de Java ¿referencian el certificado desde el código o simplemente basta con tenerlo almacenado en algún lugar?

Gracias por su apoyo.

Saludos cordiales.

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5466
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Consumir Web Service Java por Canal HTTPS desde .Net
« Reply #6 on: Junio 13, 2014, 11:47:27 pm »
Sí, ese es el certificado.

En el caso de java se debe tener el certificado en un sitio del disco. Si es en un sitio estándar (dentro de la instalación de java), java lo sabrá encontrar. Si no está en un sitio estándar, tienes que desde código indicar dónde está.

Java viene con una herramienta (keytool) que sirve para poner los certificados en un sitio que java los encuentre http://docs.oracle.com/javase/tutorial/security/toolsign/rstep2.html

Echa uno ojo a esto a ver si te vale https://www.google.es/search?q=%22.net%22%20add%20trusted%20certificate

Se bueno.
« Last Edit: Junio 13, 2014, 11:49:40 pm by chuidiang »

eduar2083

  • Full Member
  • ***
  • Posts: 103
  • Karma: 0
    • View Profile
Re: Consumir Web Service Java por Canal HTTPS desde .Net
« Reply #7 on: Junio 17, 2014, 03:43:43 am »
Gracias Chuidiang,

Lamentablemente aún no he conseguido invocar el Web Service. Aparentemente he instalado el certificado correctamente pero me sigue arrojando una excepción. No sé si debo configurar el IIS para que admita conexiones por HTTPS. Seguiré investigando, de todas maneras si tienes alguna otra información te agradeceré mucho me puedas proporcionar.

Saludos cordiales.

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5466
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Consumir Web Service Java por Canal HTTPS desde .Net
« Reply #8 on: Junio 17, 2014, 03:53:45 am »
No sé en el caso de IIS, pero en java suele publicarse también el wsdl, de forma que https://dominio/webservice?wsdl con el navegador web te muestra el wsdl. Puedes probar con https:// .... y ver si lo lees bien, así estás seguro que IIS tiene habilitado https. Si no lo tiene, no funcionará, pero esta frase tuya " cuando yo pego la url del servicio en el navegador Internet Explorer, salta un error de certificado pero al continuar, he logrado obtener un archivo con extensión .cer" hace enteder que si lo tienes.

Se bueno.

eduar2083

  • Full Member
  • ***
  • Posts: 103
  • Karma: 0
    • View Profile
Re: Consumir Web Service Java por Canal HTTPS desde .Net
« Reply #9 on: Junio 19, 2014, 06:24:35 am »
Gracias Chuidiang,

Había dicho que el Web Service está alojado en un servidor weblogic ya que está implementado en Java, es totalmente ajeno al servidor donde se aloja la aplicación que estoy desarrollando. Cuando dije que pegaba la url en el navegador IE era porque intentaba probar la comunicación y obtener el XML de dicho wsdl desde aquel servidor java pero me muestra un error por el certificado, pero al continuar, logra deplegar el XML y también he podido descargar el certificado (.cer). Mi duda es: dónde debo instalar (en el servidor que aloja a mi aplicativo) ese archivo .cer que he descargado (si acaso requiere ser instalado) y si debo configurar algo en el IIS donde corre mi aplicativo para que permita conexiones por https. Mencionar además, que la conexión https es únicamente para invocar al web service más no para la aplicación que estoy desarrollando ya que esta utiliza el puerto 80 para ser desplegada desde un navegador: http://servidor/miSitio. La aplicación se despliega con normalidad, el problema viene cuando ocurre alguna acción del usuario que involucra la invocación al servicio web, ocurre una Excepción. Como vuelvo a repetir, la conexión https es únicamente para consumir el web service.

Sé que usted es una autoridad en Java y que .Net le es completamente ajeno pero la verdad he buscado bastante por la red y no he logrado mi propósito.

Muchas gracias.

Saludos cordiales.

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5466
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Consumir Web Service Java por Canal HTTPS desde .Net
« Reply #10 on: Junio 19, 2014, 11:38:28 am »
Y por lo que veo, la pregunta no es de java ni de .NET, sino de configuración de IIS.

Si quieres consumir el web service servidor por IIS y con https, efectivamente, debes instalar el .cer en algún sitio de IIS y configurarlo para que de https (https va por el puerto 443, no el 80). Es posible que el mismo IIS si lo configuras para https te de la opción de crear un certificado y no necesitarías el .cer. El .cer de weblogic, salvo que uses para IIS y weblogic el mismo dominio/nombre de servidor, tampoco te serviría puesto que el .cer suele llevar dentro del nombre de dominio/servidor. Si son distintos, tendrías dos errores cuando intentes ver la URL con un navegador : que el certificado no es de confianza que es el que tienes ahora, y que el certicado no es del dominio que estás viendo.

Finalmente, si el certificado no es de confianza, el navegador te permite "saltarte" el error, pero un cliente de web service (al menos en java) no te deja, salvo que ese certificado .cer lo instales en el PC del cliente como certificado de confianza.

En cuanto a IIS con https, quizás esto te ayude http://support.microsoft.com/kb/324069/es

Se bueno.

eduar2083

  • Full Member
  • ***
  • Posts: 103
  • Karma: 0
    • View Profile
Re: Consumir Web Service Java por Canal HTTPS desde .Net
« Reply #11 on: Julio 25, 2014, 04:05:07 am »
Hola,

Perdón por resucitar el tema. Al final pude invocar el web service desde .Net. Instalé el certificado utilizando la utilidad mmc.exe de Windows y con ello pude conseguir mi propósito. La invocación funciona tanto con el servidor IIS como con el servidor Cassini. Todo ha ido muy bien hasta que finalmente llegó el momento de pasar el aplicativo a producción y es aquí donde nuevamente se me ha presentado otro problema. Han alojado el web service en otro servidor weblogic al cual funciona bien utilizando la herramienta SOAP UI, sin embargo cuando es invocado desde .Net está arrojando la siguiente Excepción:
Code: [Select]
SoapHeaderException: message created time past the current time even accounting for set clock skewEstuve revisando esta página y quizás falta alguna configuración en el servidor weblogic pero no estoy del todo seguro. Entiendo que no hay sincronización en entre el servidor y el cliente del WebService talvez sea eso.

Por otro lado, comentar que hay un cliente Java que está consumiendo el web service y también le estaba arrojando la Excepción pero lograron solucionarlo agregando las siguientes lineas antes de invocarlo:
Code: [Select]
System.setProperty("weblogic.wsee.security.clock.skew", "7200000");
System.setProperty("weblogic.wsee.security.delay.max", "7200000");
Los que implementaron este cliente Java indican que hay un desfase de tiempo entre el servidor weblogic y el servidor cliente y con ese par de lineas ya no obtienen el error. Yo no he logrado encontrar la forma como implementar esto de manera análoga en .Net.

Favor si pudiera ayudarme, estaré muy agradecido.

Saludos cordiales.

 

ey