SSL Richiesta SOAP autenticata funziona in SoapUI ma non attraverso il codice

3

Mi collego a un servizio web SOAP che richiede l'autenticazione SSL. Io (il client del servizio web) ho un file .pfx e ho fornito il certificato pubblico per quel file alla società a cui accedo il servizio web. Sono in grado di inviare una richiesta SOAP di successo al loro servizio web tramite SoapUI (dopo aver configurato SoapUI per usare .pfx).

Ora sto provando ad inviare la stessa richiesta tramite codice (VB.NET) ma avendo problemi di connessione. Il messaggio di errore che ricevo dopo aver richiamato la richiesta è: "La richiesta è stata interrotta: impossibile creare il canale sicuro SSL / TLS."

Nel codice, ho una classe proxy per il servizio web che eredita SoapHttpClientProtocol. Il codice che imposta SSL e richiama la richiesta è il seguente:

<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

Ho rintracciato entrambe le richieste in WireShark e ho visto i seguenti passaggi dell'handshake TLS:

SoapUI - Works

Codice-ErrorediautenticazioneSSL

Qualcuno ha un'idea del perché uno avrebbe successo mentre l'altro fallisce? Mi sembra che il codice non funzioni durante l'autenticazione dei client del server ... ma ho già provato a impostare il delegato ServicePointManager.ServerCertificateValidationCallback per restituire true e questo non ha cambiato nulla.

Grazie per le informazioni che puoi fornire!

EDIT: Ecco le informazioni dall'ultimo pacchetto TLS nei registri di rete. Sono le parti handshake ServerHello e Certificate dal server. Non c'erano errori che ho visto. Successivamente,c'eranosololeseguenticomunicazionitraclienteserver:

    
posta Jordan 15.04.2015 - 19:03
fonte

2 risposte

3

L'ho capito! L'handshake SSL non funzionava sul mio lato (client) perché il certificato client non aveva le autorizzazioni giuste per l'account che stava eseguendo l'applicazione web. Sono stato in grado di scoprirlo guardando nel 'Visualizzatore eventi di Windows' sotto 'Registri di Windows - > Sistema'. Lì ho visto un errore che indicava: "Si è verificato un errore irreversibile durante il tentativo di accesso alla chiave privata delle credenziali del client SSL Il codice di errore restituito dal modulo di crittografia è 0x8009030d. Lo stato di errore interno è 10003."

Cercare su Google quale stato di errore mi ha portato a questo post sul forum ( link ) che diceva che si trattava di un errore di autorizzazione. Qualsiasi account stia eseguendo l'applicazione non può accedere alla chiave privata del certificato. Per risolvere questo problema ho semplicemente dato il permesso di lettura per il mio certificato client all'account corretto tramite MMC in Windows. Questo post fornisce alcune informazioni su come farlo: link

Speriamo che questo aiuti qualcuno in futuro! Ricordati di controllare le tue autorizzazioni!

    
risposta data 16.04.2015 - 16:46
fonte
0

Ho trovato questo post in cui qualcuno ha ricevuto la stessa frase di errore "La richiesta era interrotto: impossibile creare il canale sicuro SSL / TLS. " (anche se lo considero come una descrizione molto generica). Dice che devi installare il certificato client nell'archivio del computer locale .

L'hai fatto? In caso contrario, come funziona per te?

    
risposta data 16.04.2015 - 16:39
fonte

Leggi altre domande sui tag