9

Po raz pierwszy muszę korzystać z uwierzytelniania certyfikatów. Partner komercyjny ujawnia dwie usługi: usługę sieciową XML i usługę HTTP. Muszę uzyskać dostęp do obu z nich za pomocą klientów .NET.Uzyskiwanie dostępu do usługi sieci Web i interfejsu HTTP przy użyciu uwierzytelniania certyfikatów

Co Próbowałem

0. Konfigurowanie środowiska

Mam zainstalowaną SSLCACertificates (na korzeń i dwa pośrednie) oraz certyfikat klienta w moim lokalnym komputerze (win 7 Professional) przy użyciu narzędzia certmgr.exe.

1. W przypadku usługi internetowej

  • mam certyfikat klienta (der).
  • Usługa zostanie wykorzystana przez serwer proxy .NET.

Oto kod:

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); 

Wyjątek zgłaszane w ostatnim zdaniu: The request failed with an empty response.

2. W przypadku interfejsu HTTP

  • jest to interfejs HTTPS Muszę zadzwonić poprzez metody POST.
  • Żądanie HTTPS zostanie wysłane z klienta .NET za pomocą HTTPWebRequest.

Oto kod:

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()); 

Wyjątek zgłaszane w ostatnim zdaniu: The request was aborted: Could not create SSL/TLS secure channel.

3. Ostatnia próba: za pomocą przeglądarki

W Chrome po zainstalowaniu certyfikatów, jeśli próbuję uzyskać dostęp oba adresy URL dostaję błąd: 107

Error 107 (net::ERR_SSL_PROTOCOL_ERROR) 

siedzę.

+1

U nie może dokonać żądania HTTP z certyfikatów SSL athorization. Trzeba to zrobić przez https. Czy potrzebujesz tego certyfikatu? Jeśli odpowiedź brzmi "tak", musisz sprawić, aby ta usługa internetowa komunikowała się przez https. – harry180

+0

@ harry180. Dzięki za wyjaśnienie. Zmontowałem to pytanie. –

+0

w protokole http, gdy wyślesz nazwę użytkownika i hasło, musi być zaszyfrowane minimum w MD5. Nawet jeśli to zrobisz, łatwo jest przekazać te informacje nieupoważnionym osobom. Ponownie rozważ wykorzystanie protokołu https do tego rodzaju udostępniania informacji. – harry180

Odpowiedz

5

Poniższe informacje pomogą ci zidentyfikować problem. Oto dwie metody testowania połączenia SSL, podczas których testowana jest strona, podczas gdy druga to metoda wywołania zwrotnego, która pozwala zidentyfikować przyczynę niepowodzenia SSL. Jeśli nic innego nie powinno dać ci lepszego pomysłu, dlaczego się nie udaje.

Po wywołaniu tej metody pojawi się okno dialogowe wyboru certyfikatu, oczywiście, gdy robisz to naprawdę, będziesz chciał automatycznie odczytać z magazynu certyfikatów. Powodem, dla którego to napisałem, jest to, że jeśli nie zostanie znaleziony prawidłowy certyfikat, to wiesz, że problem dotyczy sposobu instalacji certyfikatu.

Najlepszą rzeczą do zrobienia jest umieścić ten kod w prosty app konsoli:

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

Wielkie dzięki. Dam temu szansę. –

Powiązane problemy