¿Cómo agregar una llave privada y certificado al cliente de un Web Service creando un canal SSL/TLS?

publicado por: Anonymous

Cuento con un WSDL el cual, al momento de realizar la solicitud, tanto cliente y servidor utilizan certificados, cuento con un certificado .cer y una llave pública .pfx.

En SOAP UI, solo es necesario la llave pública para realizar la solicitud, pero con el WSDL, el servidor cancela la solicitud o no puede crear un canal SSL/TLS.

 ws1.ClientCertificates.AddRange( new X509Certificate[]{ new X509Certificate2(getCertificate("xcertificado")), new X509Certificate2("/xLlavePrivada.pfx","pass"});

Además, seguí esta guía para la búsqueda del certificado: How to call a Web service by using a client certificate for authentication in an ASP.NET Web application

Consigo el certificado desde una colección de certificados, y lo devuelvo.

 private static Microsoft.Web.Services2.Security.X509.X509Certificate getCertificate(string certificateName)
    {

        X509CertificateStore certificateStore = X509CertificateStore.CurrentUserStore(X509CertificateStore.RootStore);

        certificateStore.OpenRead();
        writeLog("Store abierto.");
        //Look for the first certificate that is named SecureMathClient.

        //Look in the local machine store.
        Microsoft.Web.Services2.Security.X509.X509CertificateCollection collection = certificateStore.FindCertificateBySubjectString(certificateName);
        Microsoft.Web.Services2.Security.X509.X509Certificate certificate = null;
            try
            {
                certificate = collection[0];
                //certificate.

                writeLog("Certificado encontrado: "+ certificate.Subject + ' ' + certificate.FriendlyDisplayName);
                return certificate;
            }
            catch (Exception e)
            {

                throw new Exception("Certificado no encontrado." + e.Message);
            }
    }

Pero aun así no puedo crear una conexión segura, ya que al hacer la solicitud lanza la excepción:

The request was aborted: Could not create SSL/TLS secure channel

solución

Lo resolví. Al agregar los protocolos de seguridad del PointManager.

        ServicePointManager.Expect100Continue = true;
        writeLog("100-CONTINUE");
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
        writeLog("SSL protocol.");
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

Además, averigüé que el servicio necesitaba verificación de dos pasos, así que, agregué el ServerCertificateValidationCallback:

  System.Net.ServicePointManager.ServerCertificateValidationCallback +=
        (se, cert, chain, sslerror) =>
        {
            return true;
        };

Con ello se logra crear una conexión segura. A pesar de agregar los certificados, verificar el certificado del servidor, se debe de especificar los protocolos de conexión.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *