9

È la prima volta che utilizzo l'autenticazione del certificato. Un partner commerciale espone due servizi, un servizio Web XML e un servizio HTTP. Devo accedere a entrambi con i client .NET.Accesso a un servizio Web e un'interfaccia HTTP utilizzando l'autenticazione del certificato

Quello che ho cercato

0. Impostazione dell'ambiente

Ho installato le SSLCACertificates (su radici e due intermedi) e il certificato client nella mia macchina locale (win 7 Professional) utilizzando certmgr.exe.

1. Per il servizio web

  • ho il certificato client (der).
  • Il servizio verrà utilizzato tramite un proxy .NET.

Ecco il codice:

OrderWSService proxy = new OrderWSService(); 
string CertFile = "ClientCert_DER.cer"; 

proxy.ClientCertificates.Add(new System.Security.Cryptography.X509Certificates.X509Certificate(CertFile)); 
orderTrackingTO ot = new orderTrackingTO() { order_id = "80", tracking_id = "82", status = stateOrderType.IN_PREPARATION }; 
resultResponseTO res = proxy.insertOrderTracking(ot); 

Eccezione riportato finalmente dichiarazione: The request failed with an empty response.

2. Per l'interfaccia HTTP

  • Si tratta di un'interfaccia HTTPS devo chiamare attraverso il metodo POST.
  • La richiesta HTTPS verrà inviata da un client .NET utilizzando HTTPWebRequest.

Ecco il codice:

string PostData = "MyPostData"; 

//setting the request 
HttpWebRequest req; 
req = (HttpWebRequest)HttpWebRequest.Create(url); 
req.UserAgent = "MyUserAgent"; 
req.Method = "POST"; 
req.ContentType = "application/x-www-form-urlencoded"; 
req.ClientCertificates.Add(new System.Security.Cryptography.X509Certificates.X509Certificate(CertFile, "MyPassword")); 

//setting the request content 
byte[] byteArray = Encoding.UTF8.GetBytes(PostData); 
Stream dataStream = req.GetRequestStream(); 
dataStream.Write(byteArray, 0, byteArray.Length); 
dataStream.Close(); 

//obtaining the response 
WebResponse res = req.GetResponse(); 
r = new StreamReader(res.GetResponseStream()); 

Eccezione riportato finalmente dichiarazione: The request was aborted: Could not create SSL/TLS secure channel.

3. Ultimo tentativo: utilizzando il browser

In Chrome, dopo aver installato i certificati, se provo ad accedere entrambi gli URL ottengo un errore 107:

Error 107 (net::ERR_SSL_PROTOCOL_ERROR) 

sono bloccato.

+1

U non è possibile effettuare richieste HTTP con i certificati SSL athorization. È necessario farlo tramite https. Hai bisogno di questo certificato? Se la risposta è sì, è necessario rendere questo servizio Web di comunicazione tramite https. – harry180

+0

@ harry180. Grazie per chiarire. Ho modificato la domanda. –

+0

nel protocollo http quando si invierà un nome utente e una password, è necessario che sia crittografato minimo in MD5. Anche quando lo fai è abbastanza facile divulgare queste informazioni a persone non autorizzate. Riconsiderare l'uso del protocollo https per quel tipo di condivisione delle informazioni. – harry180

risposta

5

Quanto segue dovrebbe aiutare a identificare il problema, qui ci sono due metodi per testare la connettività SSL uno prova il sito mentre l'altro è un metodo di callback per identificare il motivo per cui SSL non è riuscito. Se non altro, dovrebbe darti un'idea migliore del perché sta fallendo.

Quando viene chiamato il metodo, verrà visualizzata la finestra di dialogo di selezione del certificato, ovviamente quando lo si fa per davvero, si vorrà leggere automaticamente dal negozio di certificati. Il motivo per cui ho inserito questo è perché se non si trova un certificato valido, si saprà che il problema riguarda il modo in cui il certificato è installato.

La cosa migliore da fare è mettere questo codice in una semplice console app:

using System.Security.Cryptography.X509Certificates; 
using System.Net.Security; 
using System.Net; 

private static void CheckSite(string url, string method) 
{ 
    X509Certificate2 cert = null; 
    ServicePointManager.ServerCertificateValidationCallback += ValidateRemoteCertificate; 

    X509Store store = new X509Store(StoreLocation.LocalMachine); 
    store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); 
    X509Certificate2Collection certcollection = (X509Certificate2Collection)store.Certificates; 
    // pick a certificate from the store 
    cert = X509Certificate2UI.SelectFromCollection(certcollection, 
      "Caption", 
      "Message", X509SelectionFlag.SingleSelection)[0]; 

    store.Close(); 

    HttpWebRequest ws = (HttpWebRequest)WebRequest.Create(url); 
    ws.Credentials = CredentialCache.DefaultCredentials; 
    ws.Method = method; 
    if (cert != null) 
     ws.ClientCertificates.Add(cert); 

    using (HttpWebResponse webResponse = (HttpWebResponse)ws.GetResponse()) 
    { 
     using (Stream responseStream = webResponse.GetResponseStream()) 
     { 
      using (StreamReader responseStreamReader = new StreamReader(responseStream, true)) 
      { 
       string response = responseStreamReader.ReadToEnd(); 
       Console.WriteLine(response); 
       responseStreamReader.Close(); 
      } 

      responseStream.Close(); 
     } 
     webResponse.Close(); 
    } 
} 

/// <summary> 
/// Certificate validation callback. 
/// </summary> 
private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error) 
{ 
    // If the certificate is a valid, signed certificate, return true. 
    if (error == System.Net.Security.SslPolicyErrors.None) 
    { 
     return true; 
    } 

    Console.WriteLine("X509Certificate [{0}] Policy Error: '{1}'", 
     cert.Subject, 
     error.ToString()); 

    return false; 
} 
+0

Grazie mille. Lo proverò. –

Problemi correlati