He escrito una solicitud (en C #) para comunicarme con uno de nuestros clientes a través de un servicio web. Nuestro cliente nos obliga a utilizar SSL bidireccional. El cliente nos ha enviado su certificado (en forma de un archivo .p7b). El certificado de cliente me fue proporcionado en forma de un archivo .cer.
He instalado los certificados y en el programa uso la clase HttpWebRequest y agrego el certificado del cliente a la colección de Certificados de Clientes.
Cuando ejecuto el programa obtengo una excepción:
System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
He utilizado WireShark para intentar diagnosticar el error y veo esto (direcciones IP eliminadas):
1615 12.259771000 CLIENT_IP SERVER_IP SSLv3 112 Client Hello
1629 12.429299000 SERVER_IP CLIENT_IP SSLv3 1488 Server Hello, Certificate, Certificate Request, Server Hello Done
1630 12.445672000 CLIENT_IP SERVER_IP SSLv3 397 Alert (Level: Warning, Description: No Certificate), Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
1645 12.666191000 SERVER_IP CLIENT_IP SSLv3 61 Alert (Level: Fatal, Description: Handshake Failure)
Parece que el servidor ha enviado su certificado, pero por alguna razón, mi aplicación no está devolviendo uno, por lo que envía la alerta Sin certificado. Sin embargo, en mi código, parece encontrar el certificado y se agrega a la colección ClientCertificate de la clase HttpWebRequest. Dado que soy bastante nuevo en SSL, no estoy seguro de cuál es el problema. Podría ser un error de programación, pero el uso de algunos certificados de prueba parece funcionar. ¿La alerta indica que hay un problema con el certificado del cliente? Algunas publicaciones que he leído parecen indicar que, aunque la clave privada no se envía al servidor, todavía es necesaria en el lado del cliente. Pero después de cargar el certificado (usando la clase .Net X509Certificate2), me doy cuenta de que la propiedad PrivateKey es nula. ¿Podría ser esta la fuente del problema? El archivo .cer me lo proporcionó otra persona de la empresa.
Cualquier ayuda o sugerencia sería útil. Me he abstenido de publicar el código porque no estoy seguro de que sea bienvenido aquí, pero puedo publicar algunos si es necesario.