9

का उपयोग कर वेब सेवा और HTTP इंटरफ़ेस तक पहुंचना यह पहली बार है जब मुझे प्रमाण पत्र प्रमाणीकरण का उपयोग करना है। एक वाणिज्यिक भागीदार दो सेवाओं, एक एक्सएमएल वेब सेवा और एक HTTP सेवा का पर्दाफाश करता है। मुझे दोनों को .NET क्लाइंट के साथ एक्सेस करना होगा।सर्टिफिकेट प्रमाणीकरण

मैं

0. क्या कोशिश की है पर्यावरण

मैं SSLCACertificates (रूट और दो मध्यवर्ती पर) स्थापित किया है और अपने स्थानीय मशीन में क्लाइंट प्रमाणपत्र की स्थापना (7 पेशेवर जीत) certmgr.exe का उपयोग कर।

1. वेब सेवा

  • के लिए मैं क्लाइंट प्रमाणपत्र (der) है।
  • सेवा .NET प्रॉक्सी के माध्यम से खपत की जाएगी।

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

    अपवाद पिछले बयान पर सूचना: The request failed with an empty response

कोड यह रहा।

2. HTTP इंटरफ़ेस

  • के लिए यह मैं POST पद्धति के माध्यम से कॉल करने के लिए एक HTTPS इंटरफ़ेस है।
  • HTTPS अनुरोध HTTPWebRequest का उपयोग कर .NET क्लाइंट से भेजा जाएगा।

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

    अपवाद पिछले बयान पर सूचना: The request was aborted: Could not create SSL/TLS secure channel

कोड यह रहा।

3. अंतिम कोशिश:

Error 107 (net::ERR_SSL_PROTOCOL_ERROR) 

मैं अटक कर रहा हूँ: ब्राउज़र

का उपयोग करके Chrome में, प्रमाण पत्र स्थापित करने के बाद, अगर मैं दोनों यूआरएल तक पहुँचने का प्रयास मैं एक 107 त्रुटि मिलती है।

+1

यू SSL प्रमाणपत्र athorization साथ HTTP अनुरोध नहीं कर सकते। यह https के माध्यम से किया जाना चाहिए। क्या आपको इस प्रमाणपत्र की आवश्यकता है? अगर उत्तर हाँ है तो आपको https के माध्यम से इस वेब सेवा को संचारित करना होगा। – harry180

+0

@ हैरी 180। स्पष्ट करने के लिए धन्यवाद। मैंने सवाल संपादित किया। http प्रोटोकॉल में –

+0

आप एक उपयोगकर्ता नाम भेजने के लिए और यह MD5 में न्यूनतम एन्क्रिप्ट होने के लिए किया है pasword जाएगा। यहां तक ​​कि जब आप ऐसा करते हैं तो यह जानकारी अनधिकृत व्यक्तियों को लीक करना बहुत आसान है। उस तरह की जानकारी साझा करने के लिए https प्रोटोकॉल का उपयोग कर पुनर्विचार करें। – harry180

उत्तर

5

निम्नलिखित समस्या को पहचानने में आपकी सहायता करनी चाहिए, एसएसएल कनेक्टिविटी का परीक्षण करने के लिए यहां दो विधियां हैं, एक साइट पर परीक्षण करता है जबकि दूसरा यह पहचानने के लिए कॉलबैक विधि है कि एसएसएल विफल क्यों हुआ। यदि कुछ और नहीं है तो आपको यह बेहतर विचार देना चाहिए कि यह क्यों विफल रहा है।

जब विधि कहा जाता है तो यह चयन प्रमाणपत्र संवाद बॉक्स के साथ पॉप अप करेगा, जाहिर है जब आप इसे वास्तविक रूप से करते हैं तो आप स्वचालित रूप से प्रमाणपत्र स्टोर से पढ़ना चाहेंगे। कारण मैंने इसे रखा है क्योंकि यदि कोई वैध प्रमाणपत्र नहीं मिला है तो आपको पता चलेगा कि आपकी समस्या प्रमाण पत्र स्थापित होने के तरीके के साथ है।

करने के लिए सबसे अच्छी बात एक सरल सांत्वना अनुप्रयोग में इस कोड डाल दिया है:

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

बहुत बहुत धन्यवाद। मै उसे करने की एक कोशिश तो करूंगा। –