Pregunta

Así que tengo una ServiceReference añade a una aplicación de consola de C # que llama a un servicio Web que se expone desde Oracle.

Tengo todo configurado y funciona como los melocotones cuando no está usando SSL (http). Estoy tratando de configurarlo usando SSL ahora, y estoy corriendo en problemas con la adición a las referencias de servicio (o incluso Referencias Web). Por ejemplo, la dirección URL (HTTPS) que el servicio está siendo expuesto en adelante, no devuelve los métodos correspondientes en la Web cuando intento agregar en Visual Studio.

  

La conexión subyacente se cerró: Se ha producido un error inesperado en un envío.   Recibió un EOF inesperado o 0 bytes desde el flujo de transporte.   Metadatos contiene una referencia que no pueda ser resuelto: ' https://srs204.mywebsite.ca:7776 / somedirectory / MyWebService? WSDL '

Otro dilema que tengo es en lo que respecta a la gestión de certificados y el despliegue. Tengo alrededor de 1000 sitios de los clientes externos que tendrán que utilizar esta pequeña utilidad y que van a necesitar el certificado instalado en el almacén cert apropiada con el fin de conectar con el servicio Web. No está seguro sobre el mejor enfoque para el manejo de este. Es lo que necesitan para estar en el almacén raíz?

He pasado bastantes horas en la web mirando por encima de varias opciones, pero no puedo conseguir una buena respuesta limpia en cualquier lugar.

Para resumir, tengo un par de preguntas aquí:

1) ¿Alguien tiene algunos buenos enlaces en la creación de servicios web en Visual Studio que utilizan SSL?

2) ¿Cómo debo registrar el certificado? ¿Qué tienda debe existir en ella? ¿Puedo usar algo como CertMgr para registrarlo?

Tiene que haber un buen libro / tutorial / lo que sea que me va a mostrar buenas prácticas comunes sobre la configuración de algo como esto. Me parece que no puede encontrarlo!

¿Fue útil?

Solución

Bueno, he cuenta de esto. Me tomó mucho más tiempo de lo que me gustaría hablar, pero quería compartir mi solución, ya que es una manía enorme de la mina para ver el estándar. "Oh, lo arreglé! Gracias!" mensajes que dejan colgando en todo el mundo lo que realmente ocurrió.

Por lo tanto.

La raíz del problema era que, por defecto Visual Studio 2008 utiliza TLS para el protocolo de enlace SSL y el servicio web basado en Oracle / Java que yo estaba tratando de conectar con utilizaba SSL3.

Cuando se utiliza la opción "Agregar referencia de servicio ..." en Visual Studio 2008, tiene hay manera de especificar que el protocolo de seguridad para el gestor de punto de servicio debe ser SSL3.

A menos.

Se toma un documento WSDL estática y para generar una clase de proxy .

wsdl /l:CS /protocol:SOAP /namespace:MyNamespace MyWebService.wsdl

A continuación, puede utilizar la sostenido de C Compiler convertir esa clase de proxy en una biblioteca (dLL) y añadirlo a sus proyectos .Net "Referencias".

csc /t:library /r:System.Web.Services.dll /r:System.Xml.dll MyWebService.cs

En este punto también hay que asegurarse de que usted ha incluido en sus System.Web.Services "Referencias" también.

Ahora usted debería ser capaz de llamar al servicio web sin un problema en el código. Para que sea trabajo usted va a necesitar una línea magia de código añadido antes de crear una instancia del servicio.

// We're using SSL here and not TLS. Without this line, nothing workie.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

Bueno, por lo que estaba sintiendo bastante impresionado con mi mismo como prueba fue muy bien en mi caja dev. Entonces Desplegué a otro cuadro de cliente y que no iba a conectar de nuevo debido a un / edición de los permisos autoridad. Este olía certificados a mí (lo que huelen a). Para resolver esto, acostumbrado a Certmgr.exe registrar el certificado para el sitio a la raíz de confianza del equipo local.

certmgr -add -c "c:\someDir\yourCert.cer" -s -r localMachine root

Esto me permite distribuir el certificado a nuestros sitios del cliente e instalar automáticamente para los usuarios. Todavía no estoy seguro de cómo la "seguridad amigable" las diferentes versiones de las ventanas serán en lo que respecta a los registros de certificados automatizados como ésta, pero ha trabajado muy bien hasta ahora.

La esperanza esta respuesta ayuda a algunas personas. Gracias a blowdart también por toda su ayuda en este caso y proporcionando una cierta penetración.

Otros consejos

Parece que el servicio web está utilizando un certificado autofirmado. Francamente esto no es el mejor enfoque.

Si se asume que eres una organización grande y es interna usted puede configurar su propia autoridad de certificación de confianza, esto es especialmente fácil con Active Directory . A partir de ese CA del servidor que aloja el servicio de Oracle podría solicitar un certificado y se puede utilizar la política de AD a confiar en el certificado raíz de la entidad de certificación interna, colocándolo en la raíz de confianza del almacén del equipo. Esto eliminaría la necesidad de confiar o aceptar el certificado en el servicio web de forma manual.

Si las máquinas cliente son externos, entonces vamos a tener que conseguir la gente que exponen el servicio, ya sea a comprar un certificado de "real" de una de las entidades emisoras conocidas como Verisign, Thawte, GeoTrust etc., o como parte de su instalación bundle el certificado público e instalarla en autoridades de certificación raíz de confianza en el nivel de la máquina en cada máquina. Esto tiene problemas, por ejemplo, no hay manera de revocar el certificado, pero eliminará el mensaje.

Gracias por este gran consejo, tomó un vistazo a su alrededor en su materia y usted tiene un montón de buenas ideas pasando. Aquí está mi pequeño granito de arena para añadir - Estoy averiguar webMethods y tiene los mismos problemas que el servidor de aplicaciones Oracle conectado a (SSL3 en lugar de TLS) (¡sorpresa!). Su enfoque funcionó muy bien, aquí está mi apéndice.

Dado clase estática "de fábrica", proporcionan estos dos elementos práctico-excelente:

/// <summary>
/// Used when dispatching code from the Factory (for example, SSL3 calls)
/// </summary>
/// <param name="flag">Make this guy have values for debugging support</param>
public delegate void CodeDispatcher(ref string flag);

/// <summary>
/// Run code in SSL3 -- this is not thread safe. All connections executed while this
/// context is active are set with this flag. Need to research how to avoid this...
/// </summary>
/// <param name="flag">Debugging context on exception</param>
/// <param name="dispatcher">Dispatching code</param>
public static void DispatchInSsl3(ref string flag, CodeDispatcher dispatcher)
{
  var resetServicePoint = false;
  var origSecurityProtocol = System.Net.ServicePointManager.SecurityProtocol;
  try
  {
    System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3;
    resetServicePoint = true;
    dispatcher(ref flag);
  }
  finally
  {
    if (resetServicePoint)
    {
      try { System.Net.ServicePointManager.SecurityProtocol = origSecurityProtocol; }
      catch { }
    }
  }
}

Y después de consumir estas cosas (como sin duda habrá adivinado ya, pero pone un redoble de tambor aquí de todos modos):

    var readings = new ArchG2.Portal.wmArchG201_Svc_fireWmdReading.wmdReading[] {
      new ArchG2.Portal.wmArchG201_Svc_fireWmdReading.wmdReading() {
        attrID = 1, created = DateTime.Now.AddDays(-1), reading = 17.34, userID = 2
      },
      new ArchG2.Portal.wmArchG201_Svc_fireWmdReading.wmdReading() {
        attrID = 2, created = DateTime.Now.AddDays(-2), reading = 99.76, userID = 3
      },
      new ArchG2.Portal.wmArchG201_Svc_fireWmdReading.wmdReading() {
        attrID = 3, created = DateTime.Now.AddDays(-5), reading = 82.17, userID = 4
      }
    };
    ArchG2.Portal.Utils.wmArchG201.Factory.DispatchInSsl3(ref flag, (ref string flag_inner) =>
    {
      // creates the binding, endpoint, etc. programatically to avoid mucking with
      // SharePoint web.config.
      var wsFireWmdReading = ArchG2.Portal.Utils.wmArchG201.Factory.Get_fireWmdReading(ref flag_inner, LH, Context);
      wsFireWmdReading.fireWmdReading(readings);
    });

Eso hace el truco -. Cuando llegue algún tiempo más voy a resolver el problema de roscado (o no)

Como no tengo la reputación de comentar, me gustaría hablar de esa respuesta y código de ejemplo de Mat Nadrofsky para forzar SSL3 es también la solución para un error similar al

  

Se ha producido un error al realizar la   solicitud HTTP al https: // xxxx / lo que sea .   Esto podría ser debido al hecho de que la   certificado del servidor no está configurado   correctamente con HTTP.SYS en el HTTPS   caso. Esto también podría ser causada por una   desajuste de la seguridad de la unión   entre el cliente y el servidor.

Sólo tiene que utilizar

// We're using SSL here and not TLS. Without this line, nothing workie.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

como se ha mencionado por Mat. Probado con un servidor SAP NetWeaver PI en HTTPS. Gracias!

Mat,

Yo tenía estas cuestiones demasiado y tengo una manera de evitar el uso de Certmgr.exe añadir certificados a raíz de confianza en una máquina remota.

X509Store store;
store = new X509Store("ROOT", StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
store.Add(certificate);

El 'objeto de certificado' se puede crear de esta manera:

X509Certificate2 certificate = new X509Certificate2("Give certificate location path here");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top