SSL La solicitud de SOAP autenticada funciona en SoapUI pero no a través del código

3

Me estoy conectando a un servicio web SOAP que requiere autenticación SSL. Yo (el cliente del servicio web) tengo un archivo .pfx y proporcioné el certificado público para ese archivo a la empresa a la que estoy accediendo al servicio web. Puedo enviar una solicitud de SOAP exitosa a su servicio web a través de SoapUI (después de configurar SoapUI para usar el .pfx).

Ahora estoy intentando enviar la misma solicitud a través del código (VB.NET) pero tengo problemas para conectar. El mensaje de error que recibo después de invocar la solicitud es: "La solicitud fue cancelada: no se pudo crear el canal seguro SSL / TLS".

En el código, tengo una clase de proxy para el servicio web que hereda SoapHttpClientProtocol. El código que configura el SSL e invoca la solicitud es el siguiente:

<System.Web.Services.Protocols.SoapDocumentMethodAttribute("UpdateLeadByDMS_v1", Use:=System.Web.Services.Description.SoapBindingUse.Literal, _
        ParameterStyle:=System.Web.Services.Protocols.SoapParameterStyle.Bare), _
        CaptureMessageExtension()>
    Public Function UpdateLeadByDMS_v1(ByVal leadPushRequest As LeadPushRequest) As LeadPushResponse
        Dim store As X509Store = Nothing
        Try
            store = New X509Store(StoreName.My, StoreLocation.LocalMachine)
            store.Open(OpenFlags.OpenExistingOnly Or OpenFlags.ReadOnly)
            Const thumbprint As String = "36C82D8E7BAEEB2E9B88F4748CB60AE6E0A89F64"
            Dim certCollection As X509Certificate2Collection = store.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, False)
            If certCollection.Count > 0 Then
                Dim cert As X509Certificate2 = certCollection(0)
                Me.ClientCertificates.Add(cert)
            End If
        Finally
            If store IsNot Nothing Then
                store.Close()
            End If
        End Try
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
        Dim results() As Object
        Try
            results = Me.Invoke("UpdateLeadByDMS_v1", New Object() {leadPushRequest})
        Catch ex As Exception
            SendError(New Exception(ex.Message))
            Throw
        End Try

        Return CType(If(results IsNot Nothing, results(0), Nothing), LeadPushResponse)
    End Function

He rastreado ambas solicitudes en WireShark y he visto los siguientes pasos del protocolo de enlace TLS:

SoapUI - Trabajos

Código

:fallalaautenticaciónSSL

¿Alguien tiene una idea de por qué uno podría tener éxito mientras que el otro falla? Me parece que el código está fallando durante la autenticación de los clientes del servidor ... pero ya he intentado configurar el delegado ServicePointManager.ServerCertificateValidationCallback para que devuelva true y eso no cambió nada.

¡Gracias por cualquier información que pueda proporcionar!

EDITAR: Aquí está la información del último paquete TLS en los registros de la red. Son las partes del protocolo de enlace ServerHello y Certificate del servidor. No hubo errores que vi. Despuésdeesosolohubolassiguientescomunicacionesentreelclienteyelservidor:

    
pregunta Jordan 15.04.2015 - 19:03
fuente

2 respuestas

3

Lo descubrí! El protocolo de enlace SSL estaba fallando en mi lado (cliente) porque el certificado del cliente no tenía los permisos correctos para la cuenta que ejecutaba la aplicación web. Pude descubrirlo al buscar en el "Visor de eventos de Windows" en "Registros de Windows - > Sistema'. Allí vi un error que decía: "Se produjo un error grave al intentar acceder a la clave privada de la credencial del cliente SSL. El código de error devuelto por el módulo criptográfico es 0x8009030d. El estado de error interno es 10003."

Buscar en Google ese estado de error me llevó a esta publicación del foro ( enlace ) que dijo que era un error de permisos. Cualquiera que sea la cuenta que estaba ejecutando, la aplicación no pudo acceder a la clave privada del certificado. Para solucionar este problema, simplemente le di permiso de lectura para el certificado de mi cliente a la cuenta correcta mediante MMC en Windows. Esta publicación proporciona información sobre cómo hacerlo: enlace

¡Espero que esto ayude a alguien en el futuro! ¡Recuerda revisar tus permisos!

    
respondido por el Jordan 16.04.2015 - 16:46
fuente
0

Encontré esta publicación donde alguien recibió la misma frase de error "La solicitud fue abortado: no se pudo crear el canal seguro SSL / TLS ". (aunque lo considero como una descripción muy genérica). Dice que necesita instalar el certificado de cliente en la tienda local de computadoras .

¿Hiciste eso? Si no es así, ¿cómo te funciona?

    
respondido por el DarkLighting 16.04.2015 - 16:39
fuente

Lea otras preguntas en las etiquetas