9

Sertifika kimlik doğrulamasını ilk defa kullanmam gerekiyor. Ticari bir iş ortağı iki hizmeti, bir XML Web Hizmetini ve bir HTTP hizmetini gösterir. Her ikisine de .NET istemcileriyle erişmem gerekiyor. Ben (kökü ve iki ara üzerine) SSLCACertificates yüklemişSertifika kimlik doğrulaması kullanarak bir web hizmetine ve HTTP arayüzüne erişme

çevre ve benim yerel makinede istemci sertifikası kurma

0. denedi Ne

(7 profesyonel kazanmak) certmgr.exe'yi kullanma. web hizmeti

  • için

    1.

    ben istemci sertifikasını (der) var.
  • Hizmet, bir .NET proxy'si kullanılarak tüketilecektir. Geçen açıklamada rapor

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

    İstisna: The request failed with an empty response

İşte kod. HTTP arayüzü

  • için

    2. ı POST yöntemi ile aramak zorunda HTTPS arayüzüdür.

  • HTTPS isteği, HTTPWebRequest kullanarak bir .NET istemcisinden gönderilecektir. Geçen açıklamada rapor

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

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

İşte kod.

3. Son deneme:

Error 107 (net::ERR_SSL_PROTOCOL_ERROR) 

Ben şaşırıp: Her iki URL'ler erişmeye çalışırsanız Chrome'da tarayıcı

kullanarak, sertifikalarını yükledikten sonra, bir 107 hatası alıyorum.

+1

U SSL sertifikaları athorization ile http isteklerini yapamazsınız. Https ile yapılması gerekiyor. Bu sertifikaya ihtiyacınız var mı? Cevabınız evet ise, bu web servisini https üzerinden iletmek zorundasınız. – harry180

+0

@ harry180. Açıkladığın için teşekkürler. Soruyu düzenledim. Bir kullanıcı adı ve pasword göndereceğiniz zaman http protokolünde –

+0

, MD5'te en az şifrelenmiş olması gerekir. Bunu yaptığınızda bile, bu bilgiyi yetkisiz kişilere sızdırmak oldukça kolaydır. Bu tür bilgi paylaşımı için https protokolünü tekrar gözden geçirin. – harry180

cevap

5

Aşağıdakiler sorunu tanımlamanıza yardımcı olacaktır, burada SSL bağlantısını sınamak için iki yöntem vardır; biri sitedeki sınamaları yaparken diğeri SSL'nin neden başarısız olduğunu tanımlamak için bir geri arama yöntemidir. Eğer başka bir şey yapmazsanız, neden başarısız olduğunu daha iyi bir fikir vermelisiniz.

Metot çağrıldığında, sertifika seçimi kutucuğu açılırken, bunu gerçekte yaptığınızda, otomatik olarak cert deposundan okumak isteyeceksiniz. Bunu yapmamın nedeni, geçerli bir sertifika bulunamazsa, sorununun sertifikanın yüklenme biçimiyle olduğunu bileceksiniz.

yapılacak en iyi şey, basit bir konsol uygulaması bu kodu konur:

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

Çok teşekkürler. Bir deneyeceğim. –