Estoy intentando acceder a un servicio web SOAP hospedado públicamente (no WCF) sobre https, y me aparece un error que nunca he visto antes. Primero, aquí están los hechos:¿Cómo forzar al cliente de WCF a enviar el certificado del cliente?
- Este servicio requiere certificados del cliente. Tengo un certificado firmado por la misma CA como el certificado del servidor.
- Sé que la URL está disponible, ya que puedo acceder a ella en Internet Explorer. IE abre la ventana "elegir certificado", y si lo selecciono (e ignoro el error de servidor-nombre-host-no-coincide-certificado), continúa y me da un error HTTP 500.
- Si abro el sitio en Chrome, después de seleccionar el certificado e ignorar el error, aparece un mensaje de error normal sobre WSA Action = null.
- Si abro el sitio en FireFox, después de ignorar el error, aparece una página sobre cómo el servidor no pudo validar mi certificado. Nunca me pidió que eligiera uno, así que tiene mucho sentido.
Ahora, la excepción:
Error occurred while executing test 12302: System.ServiceModel.Security.SecurityNegotiationException: Could not establish secure channel for SSL/TLS with authority 'ihexds.nist.gov:9085'. ---> System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
at System.Net.HttpWebRequest.GetResponse()
at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
he rastreado la interacción con Wireshark, sino porque yo no soy un experto en el protocolo TLS, yo podía faltar pistas sobre lo que está pasando . Aquí, sin embargo, es lo que veo:
- C -> S Cliente Hola
- Contiene cosas como un número aleatorio, fecha/hora, suites con clave soportados, etc
- S - > C servidor Hola, certificado, de solicitud de certificado, el servidor Hola Hecho
- Contiene el certificado del servidor, y una solicitud de un certificado de cliente
- C -> S certificado, el cliente de intercambio de claves, Cambio Cipher Spec, cifrada Handshake mensaje
- Aquí está la parte INTERESANTE - La primera parte de este paquete es el apretón de manos certificado, en el que asumirá el certificado de cliente haría ser, pero no hay certificados presentes (longitud de los certificados: 0).
- S -> C Alerta (Nivel: Fatal, Descripción: Certificado malo)
- Bueno, sí, no había certificado enviado.
Mi unión está configurado de la siguiente manera:
<binding name="https_binding">
<textMessageEncoding />
<httpsTransport useDefaultWebProxy="false" />
</binding>
Mi comportamiento está configurado de la siguiente manera:
<behavior name="clientcred">
<clientCredentials>
<clientCertificate findValue="69b6fbbc615a20dc272a79caa201fe3f505664c3" storeLocation="CurrentUser" storeName="My" x509FindType="FindByThumbprint" />
<serviceCertificate>
<authentication certificateValidationMode="None" revocationMode="NoCheck" />
</serviceCertificate>
</clientCredentials>
<messageInspector />
</behavior>
Mi punto final está configurado para utilizar tanto la unión y el comportamiento. ¿Por qué WCF se niega a enviar el certificado cuando crea la conexión https?
Odio WCF tanto. Esta solución funcionó para mí, gracias montones, pero todo es tan complicado. Mátame ahora. – robnick