2010-11-03 14 views
12

मैं https पर सार्वजनिक रूप से होस्ट की गई SOAP वेब सेवा (WCF नहीं) तक पहुंचने का प्रयास कर रहा हूं, और मुझे एक त्रुटि मिल रही है जिसे मैंने कभी नहीं देखा है। सबसे पहले, यहां तथ्य हैं:डब्ल्यूसीएफ क्लाइंट को क्लाइंट प्रमाणपत्र भेजने के लिए कैसे मजबूर करें?

  • इस सेवा के लिए ग्राहक प्रमाणपत्र की आवश्यकता है। मेरे पास एक प्रमाणपत्र है जो उसी सीए द्वारा सर्वर के प्रमाण पत्र के रूप में हस्ताक्षरित है।
  • मुझे पता है कि यूआरएल उपलब्ध है, क्योंकि मैं इसे इंटरनेट एक्सप्लोरर में मार सकता हूं। आईई "प्रमाणपत्र चुनें" विंडो लाता है, और यदि मैं इसे चुनता हूं (और सर्वर-होस्ट-नाम-करता-नहीं-मैच-प्रमाणपत्र त्रुटि को अनदेखा करता है), यह चलता है और मुझे एक HTTP 500 त्रुटि देता है।
  • यदि मैं क्रोम में साइट खोलता हूं, तो प्रमाणपत्र चुनने और त्रुटि को अनदेखा करने के बाद, मुझे WSA Action = null के बारे में एक सामान्य त्रुटि संदेश मिलता है।
  • अगर मैं फ़ायरफ़ॉक्स में साइट खोलता हूं, तो त्रुटि को अनदेखा करने के बाद, मुझे एक पृष्ठ मिलता है कि सर्वर मेरे प्रमाणपत्र को कैसे सत्यापित नहीं कर सका। उसने मुझे कभी भी लेने के लिए नहीं कहा, जिससे यह सही समझ में आता है।

अब, अपवाद:

Error occurred while executing test 12302: System.ServiceModel.Security.SecurityNegotiationException: Could not establish secure channel for SSL/TLS with authority 'ihexds.nist.gov:9085'. ---> System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel. 
    at System.Net.HttpWebRequest.GetResponse() 
    at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) 

मैं WireShark के साथ बातचीत का पता लगाया गया है, लेकिन क्योंकि मैं टीएलएस प्रोटोकॉल में एक विशेषज्ञ नहीं हूँ, मैं क्या हो रहा है के रूप में सुराग याद किया जा सकता । , बीजलेख सूट का समर्थन किया, आदि

  • S> एस ग्राहक हैलो
    • एक यादृच्छिक संख्या, दिनांक/समय तरह बातें शामिल हैं -

      1. सी -: यहाँ, तथापि, मैं क्या देखते हो है > सी सर्वर हैलो, प्रमाणपत्र, प्रमाणपत्र अनुरोध, सर्वर हैलो हो गया
        • सर्वर का सुरक्षा प्रमाणपत्र शामिल हैं, और एक क्लाइंट प्रमाणपत्र
      2. के लिए एक अनुरोध
      3. सी -> एस प्रमाणपत्र, क्लाइ एक्सचेंज, बदलें सिफर युक्ति, एन्क्रिप्टेड हैंडशेक संदेश
        • यहाँ दिलचस्प भाग - इस पैकेट के पहले भाग प्रमाणपत्र हाथ मिलाना, जहां मैं क्लाइंट प्रमाणपत्र ग्रहण करेंगे है हो, लेकिन कोई प्रमाणपत्र मौजूद नहीं है (प्रमाणपत्र लंबाई: 0)।
      4. एस -> सी चेतावनी (स्तर: घातक, विवरण: बुरा प्रमाणपत्र)
        • खैर, हाँ, वहाँ भेजा कोई प्रमाण पत्र था।

      मेरे बंधन की स्थापना की है इस प्रकार है:

      <binding name="https_binding"> 
          <textMessageEncoding /> 
          <httpsTransport useDefaultWebProxy="false" /> 
      </binding> 
      

      मेरे व्यवहार की स्थापना की है इस प्रकार है:

      <behavior name="clientcred"> 
          <clientCredentials> 
           <clientCertificate findValue="69b6fbbc615a20dc272a79caa201fe3f505664c3" storeLocation="CurrentUser" storeName="My" x509FindType="FindByThumbprint" /> 
           <serviceCertificate> 
            <authentication certificateValidationMode="None" revocationMode="NoCheck" /> 
           </serviceCertificate> 
          </clientCredentials> 
          <messageInspector /> 
      </behavior> 
      

      मेरे endpoint उपयोग करने के लिए सेट किया गया है दोनों बंधन और व्यवहार। जब डब्ल्यूसीएफ ने https कनेक्शन बनाया है तो प्रमाण पत्र भेजने से इनकार क्यों करता है?

  • उत्तर

    9

    मैंने समस्या हल की, लेकिन मुझे समझ में नहीं आया कि इस कॉन्फ़िगरेशन में बदलाव क्यों हुआ।

    <httpsTransport useDefaultWebProxy="false" /> 
    
    इस के लिए

    :: मैं इस लाइन बदल

    <httpsTransport useDefaultWebProxy="false" requireClientCertificate="true" /> 
    

    और जादुई यह काम करना शुरू किया। मुझे समझ में आया था कि requireClientCertificate "घुंडी" सर्वर-साइड के लिए था, इसलिए मैंने अपनी झगड़ा के दौरान यह कोशिश नहीं की थी। जाहिर है मैं गलत था।

    +0

    मुझे डब्ल्यूसीएफ से इतना नफरत है। यह समाधान मेरे लिए काम करता है, धन्यवाद ढेर - लेकिन यह सब ठीक है। अब मुझे मार दो। – robnick

    -1

    यह सुरक्षा समस्या प्रोटोकॉल का उपयोग करने में एक समस्या हो सकती है।विशेष रूप से मैं सोच रहा हूं कि सर्वर डब्लूसीएफ को टीएलएस 1.0 का उपयोग करने की कोशिश नहीं कर सकता है। ऐसा तो नहीं है

    देखने के लिए सेवा

    System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3 
    

    यह या तो ग्राहक कोड में या में एक IEndpointBehavior

    +0

    मैंने कोशिश की, और यह परिणाम नहीं बदला। मुझे पता है कि सर्वर टीएलएस 1.0 का समर्थन करता है (और वास्तव में केवल एक विशिष्ट सिफर है, लेकिन उस सिफर हैंडशेक में सर्वर को भेजी गई सूची में है)। – Mark

    +0

    यदि एक्सचेंज को चेंजसिफर एसपीसी संदेश तक नहीं मिला है। इसका मतलब है कि प्रोटोकॉल के बारे में सब कुछ सहमत हो गया है। – EJP

    2

    किया गया है चाहिए रखकर जोड़ा जा सकता है लागू करने से पहले निम्न जोड़ने की कोशिश सर्वर से प्रमाणपत्र प्रमाणपत्र, स्वीकार्य प्रमाण प्रकार और सीए नामकरण। यदि आपका प्रमाणपत्र उनसे मेल नहीं खाता है तो यह नहीं भेजा जाएगा।

    +0

    एक प्रमाणपत्र अनुरोध था (देखें # 2), और इसमें वास्तव में सीए और प्रमाण पत्र प्रकारों की एक सूची थी। मेरे पास वास्तव में एक उचित प्रमाणपत्र है, और यह व्यवहार में निर्दिष्ट एक है। – Mark

    +0

    यदि यह सब सच है तो सर्वर से प्रमाणपत्र Request के बाद क्लाइंट से प्रमाण पत्र संदेश होता। अपरिहार्य निष्कर्ष यह है कि इसमें से कुछ सच नहीं है। आपको इसे सभी को दोबारा जांचना होगा: विशेष रूप से, प्रमाणपत्र (ए) आवेदन के लिए उपलब्ध है और (बी) सर्टिफिकेटरवेस्ट में व्यक्त की गई सभी बाधाओं के अनुरूप है। – EJP

    +0

    यह सचमुच सच है ... मेरे पास वायरशर्क कैप्चर है। मैंने समस्या को हल करने का अंत किया, हालांकि, लेकिन मैं वास्तव में समझ में नहीं आया कि मैंने इसे क्यों बदल दिया। मैं इसे एक अलग उत्तर में पोस्ट करूंगा। – Mark

    संबंधित मुद्दे