कैसे हल करें "प्राधिकरण के साथ एसएसएल / टीएलएस सुरक्षित चैनल के लिए विश्वास संबंध स्थापित नहीं कर सका"


135

वास्तव में सोचा था कि मैं इस मुद्दे को तय किया था, लेकिन यह केवल पहले ही प्रच्छन्न था।

मेरे पास HTTPS का उपयोग करके IIS 7 में WCF सेवा होस्ट की गई है। जब मैं इंटरनेट एक्सप्लोरर में इस साइट को ब्राउज़, यह एक आकर्षण की तरह काम करता है, इस वजह से मैं है स्थानीय मूल प्रमाणपत्र प्राधिकारी की दुकान में प्रमाण पत्र गयी।

मैं 1 मशीन पर विकसित कर रहा हूं, इसलिए क्लाइंट और सर्वर एक ही मशीन हैं। प्रमाणपत्र IIS 7 प्रबंधन स्नैप से सीधे स्व-हस्ताक्षरित है।

मुझे लगातार यह त्रुटि अब मिल रही है ...

प्राधिकरण के साथ एसएसएल / टीएलएस सुरक्षित चैनल के लिए विश्वास संबंध स्थापित नहीं कर सका।

... जब क्लाइंट कंसोल से कॉल किया जाता है।

मैंने स्वयं को प्रमाण पत्र, उपयोग findprivatekeyऔर उपयोग करके स्वयं को अनुमति और नेटवर्क सेवा प्रदान की cacls.exe

मैंने SOAPUI का उपयोग करके सेवा से जुड़ने की कोशिश की, और यह काम करता है, इसलिए यह मेरे क्लाइंट एप्लिकेशन में एक मुद्दा होना चाहिए, जो कि http के साथ काम करने के लिए प्रयुक्त कोड पर आधारित है।

मैं कहां देख सकता हूं कि मुझे सभी संभावनाएं समाप्त हो गई हैं कि मैं कनेक्ट क्यों नहीं कर सकता हूं?



यदि आपके पास प्रमाणपत्रों के निर्माण का नियंत्रण है, तो "वैकल्पिक विषय का नाम" न भूलें। जैसे आप "* .full.domainname.com" में एक वाइल्ड कार्ड डाल सकते हैं। Digicert.com/subject-alternative-name.htm
ग्रेनेडा कोडर

जवाबों:


198

समाधान के लिए आप के लिए कोई हैंडलर जोड़ सकता ServicePointManagerहै ServerCertificateValidationCallbackग्राहक के पक्ष:

System.Net.ServicePointManager.ServerCertificateValidationCallback +=
    (se, cert, chain, sslerror) =>
        {
            return true;
        };

लेकिन ध्यान रखें कि यह एक अच्छा अभ्यास नहीं है क्योंकि यह सर्वर प्रमाणपत्र को पूरी तरह से अनदेखा करता है और सेवा बिंदु प्रबंधक को बताता है कि जो भी प्रमाण पत्र ठीक है जो ग्राहक सुरक्षा से गंभीरता से समझौता कर सकता है। आप इसे परिष्कृत कर सकते हैं और कुछ कस्टम जाँच (प्रमाणपत्र नाम, हैश आदि के लिए) कर सकते हैं। परीक्षण प्रमाणपत्रों का उपयोग करते समय कम से कम आप विकास के दौरान समस्याओं को दरकिनार कर सकते हैं।


9
मुझे लगता है कि अधिकांश सार्वजनिक सेटअप खरीदे गए प्रमाण पत्र का उपयोग करेंगे, लेकिन सशर्त रूप से #if कथनों में उपरोक्त कोड का उपयोग करेंगे। एंटरप्राइज़ देवों को आम तौर पर एक आंतरिक सीए सर्वर >> Technet.microsoft.com/en-us/library/cc875810.aspx
ल्यूक पुप्लेट

2
डिबगिंग के लिए Fiddler2 के साथ काम करने के लिए मेरे SSL WCF कॉल प्राप्त करने का तरीका जानने में मेरी मदद की।
रोजर विल्कॉक्स

2
@karank इसे Global.asax में Application_Start पद्धति में डालने पर विचार करें (देखें stackoverflow.com/a/12507094/1175419 )। मैं ल्यूक की टिप्पणी में वर्णित #if DEBUG संकलक निर्देश या कुछ इसी तरह का उपयोग करने की जोरदार सिफारिश करूंगा।
रिच सी।

4
बहुत बढ़िया! आप System.Net.ServicePointManager.ServerCertificateValidationCallback + = (se, cert, chain, sslerror) => सत्य के रूप में लंबोदर अभिव्यक्ति का उपयोग कर सकते हैं;
धानुका Dhan।

थोड़ा अतिरिक्त स्पष्टीकरण यहाँ पाया जा सकता है: blog.effectivemessaging.com/2015_09_01_archive.html
granadaCoder

40

जब मुझे यह समस्या होती है तो यह है क्योंकि client.config के पास इसके समापन बिंदु होते हैं:

 https://myserver/myservice.svc 

लेकिन प्रमाण पत्र की उम्मीद थी

 https://myserver.mydomain.com/myservice.svc

सर्वर के FQDN से मिलान करने के लिए समापन बिंदुओं को बदलना मेरी समस्या का समाधान करता है। मुझे पता है कि यह इस समस्या का एकमात्र कारण नहीं है।


मेरे पास बस फिर से यह मुद्दा था और इस बार इसका उपयोग गलत प्रमाण पत्र के साथ किया गया था। ऐसा लगता है कि दोनों ही मामलों में इसे नामों का मिलान ठीक से करना है।
माइक शील

3
मेरे ऑटो जेनरेट किए गए कॉन्फ़िगरेशन में <endpoint address = " localhost / myservice.svc " था, जिसने इसे बदलकर <endpoint address = " mymachine.mydoman.com/myservice.svc " कर दिया।
नाइट्सचार्ज

यह बिल्कुल मेरा मुद्दा था और मुझे आपका जवाब खोजने में दो दिन लग गए। यदि मैं कर सकता हूँ तो +1, मैं आपको +1000 दूंगा।
१ie:५३ पर ऑस्ट्रेलियाई

20

पहले दो उपयोग लंबोदर, तीसरा नियमित कोड का उपयोग करता है ... आशा है कि आप इसे उपयोगी पाएंगे

            //Trust all certificates
            System.Net.ServicePointManager.ServerCertificateValidationCallback =
                ((sender, certificate, chain, sslPolicyErrors) => true);

            // trust sender
            System.Net.ServicePointManager.ServerCertificateValidationCallback
                = ((sender, cert, chain, errors) => cert.Subject.Contains("YourServerName"));

            // validate cert by calling a function
            ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate);

    // callback used to validate the certificate in an SSL conversation
    private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors)
    {
        bool result = false;
        if (cert.Subject.ToUpper().Contains("YourServerName"))
        {
            result = true;
        }

        return result;
    }

1
// सभी प्रमाणपत्रों पर विश्वास करें। }; // विश्वास प्रेषक System.Net.ServicePointManager.ServerCertificateValidationCallback + = (se, cert, chain, sslerror) => {return cert। };
वूडूचाइल्ड

1
कोई भी पटाखा उपरोक्त सभी परीक्षणों को पारित करने वाला एक प्रमाण पत्र बना सकता है। यह असुरक्षित है।
बजरतूर थोरलासियस

19

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

आपके पास कुछ विकल्प हैं - आप कर सकते हैं

  1. ग्राहक पर प्रमाणपत्र सत्यापन बंद करें (बुरा कदम, मध्यम हमलों में आदमी लाजिमी है)

  2. रूट CA बनाने और उस से प्रमाणपत्र बनाने के लिए makecert का उपयोग करें (ठीक है, लेकिन अभी भी कोई CRL नहीं है)

  3. विंडोज सर्टिफिकेट सर्वर या अन्य पीकेआई समाधान का उपयोग करके एक आंतरिक रूट CA बनाएं, फिर उस रूट सर्टिफिकेट (प्रबंधन करने के लिए थोड़ा सा दर्द) पर भरोसा करें

  4. विश्वसनीय सीए (महंगे) में से एक से एसएसएल प्रमाणपत्र खरीदना


3
(4) के बारे में, StartSSL वास्तव में आपको एक मुफ्त कक्षा 1 प्रमाणपत्र देगा जो सभी प्रमुख ब्राउज़रों में काम करता है। वे मेरे आधा दर्जन कम बैंडविड्थ साइटों के लिए मेरे लिए बहुत अच्छा काम करते हैं।
मूडबॉम

मुझे लगता है कि इस सूची में # 2 ... यह url मदद कर सकता है: blogs.technet.microsoft.com/jhoward/2005/02/02/… "" विश्वसनीय रूट प्रमाणीकरण प्राधिकरण और एसएसएल प्रमाणपत्र जारी करने के लिए मेकअर्ट का उपयोग कैसे करें "
granadaCoder

1
नोट: StartCom अब भरोसेमंद नहीं है - और अभी-अभी Chrome en.wikipedia.org/wiki/StartCom
Simon_Weaver से

16

एक लाइन समाधान। क्लाइंट की ओर से सर्वर को कॉल करने से पहले इसे कहीं भी जोड़ें:

System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate { return true; };

इसका उपयोग केवल परीक्षण उद्देश्यों के लिए किया जाना चाहिए क्योंकि क्लाइंट SSL / TLS सुरक्षा जांच को छोड़ देगा।


2
परीक्षण के लिए एक शानदार समाधान। हम एक ऐसी सेवा का उपभोग कर रहे हैं जिसके प्रदाता ने सुरक्षा प्रमाणपत्रों की एक कड़ी श्रृंखला के साथ सुरक्षा को एक जीवित नरक बना दिया है और जब तक हम उनके विस्की सेर्ट्स और ठीक से काम करने के लिए तैयार नहीं हो जाते हैं, तब तक यह समाधान केवल हमें विकास जारी रखने की अनुमति देता है।
निशानरोनकी

12

मुझे एक ही समस्या का सामना करना पड़ा और मैं इसे दो समाधानों के साथ हल करने में सक्षम था: सबसे पहले, मैंने "कंप्यूटर खाते" के लिए MMC स्नैप-इन "प्रमाणपत्र" का उपयोग किया और स्व-हस्ताक्षरित प्रमाणपत्र को "विश्वसनीय रूट प्रमाणन प्राधिकरण" फ़ोल्डर में खींच लिया । इसका मतलब है कि स्थानीय कंप्यूटर (प्रमाण पत्र उत्पन्न करने वाला) अब उस प्रमाणपत्र पर भरोसा करेगा। दूसरे मैंने देखा कि प्रमाणपत्र कुछ आंतरिक कंप्यूटर नाम के लिए जनरेट किया गया था, लेकिन वेब सेवा को किसी अन्य नाम का उपयोग करके एक्सेस किया जा रहा था। यह प्रमाण पत्र को मान्य करते समय एक बेमेल का कारण बना। हमने computer.operations.local के लिए प्रमाण पत्र तैयार किया, लेकिन https://computer.internaldomain.companydomain.com का उपयोग करके वेब सेवा तक पहुँचा । जब हमने प्रमाणपत्र जेनरेट करने के लिए उपयोग किए गए URL को स्विच किया तो हमें कोई और त्रुटि नहीं मिली।

हो सकता है कि सिर्फ स्विचिंग यूआरएल काम किया होगा, लेकिन प्रमाण पत्र पर भरोसा करके आप इंटरनेट एक्सप्लोरर में लाल स्क्रीन से भी बचते हैं जहां यह बताता है कि यह प्रमाण पत्र पर भरोसा नहीं करता है।


11

यदि आप उपयोग करते हैं। नेट कोर यह कोशिश करें:

client.ClientCredentials.ServiceCertificate.SslCertificateAuthentication =
        new X509ServiceCertificateAuthentication()
        {
            CertificateValidationMode = X509CertificateValidationMode.None,
            RevocationMode = System.Security.Cryptography.X509Certificates.X509RevocationMode.NoCheck
        };

1
धन्यवाद, यह काम करता है। लेकिन इसका .net कोर से कोई लेना-देना नहीं है। यह एक सार्वभौमिक नुस्खा है :)
अलेक्जेंडर

7

कृपया निम्न चरणों का पालन करें:

  1. IE में ओपन सर्विस लिंक।

  2. एड्रेस बार में सर्टिफिकेट एरर का उल्लेख करें और व्यू सर्टिफिकेट पर क्लिक करें।

  3. को जारी किया गया नाम: चेक।

  4. जारी नाम लें और सेवा में क्लाइंटहोल्स्ट उल्लेख को बदलें और क्लाइंट एंडपॉइंट आधार पते को पूरी तरह से योग्य डोमेन नाम (FQDN) के साथ रखें।

उदाहरण के लिए: https: // localhost : 203 / SampleService.svc to https: // INL-126166-.groupinfra.com : 203 / SampleService.svc


महान, इस उत्तर के लिए धन्यवाद! बिना किसी कोड परिवर्तन के मुद्दों को हल किया।
विपिन दुबे

6

उपरोक्त उत्तरों के अलावा, आप इस त्रुटि का सामना कर सकते हैं यदि आपका क्लाइंट गलत TLS संस्करण चला रहा है, उदाहरण के लिए यदि सर्वर केवल TLS 1.2 चला रहा है।

आप इसका उपयोग करके इसे ठीक कर सकते हैं:

// tested in .NET 4.5:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

मेरे मामले में स्वीकृत उत्तर ने मेरी मदद नहीं की, लेकिन इसने एक चाल
सर्गेई

यह एकमात्र उत्तर है जिसने मेरे मामले में त्रुटि को ठीक किया।
टोलगा

5

मुझे भी यही समस्या थी। मैंने स्थानीय स्टोर में सीए प्रमाण पत्र भी जोड़े थे, लेकिन मैंने गलत तरीके से किया।

एमएमसी कंसोल (स्टार्ट -> रन -> एमएमसी ) का उपयोग करके आपको सर्टिफिकेट जोड़ना चाहिए सेवा खाते के रूप में स्नैप-इन को (आईआईएस का सेवा खाता चुनना) या कंप्यूटर खाता (यह मशीन पर प्रत्येक खाते के लिए जोड़ता है)

यहाँ मैं किस बारे में बात कर रहा हूँ की एक छवि है सेवा खाते या कंप्यूटर खाते के लिए स्नैप-इन जोड़ें

अब यहाँ से, आप CA ( विश्वसनीय रूट CA और इंटरमीडिएट CA ) के प्रमाण पत्र जोड़ सकते हैं , और सब कुछ ठीक चलेगा


4

मेरे पास स्व-हस्ताक्षरित प्रमाण पत्र के साथ ऐसा ही मुद्दा था। मैं सर्वर के FQDN के समान प्रमाणपत्र नाम का उपयोग करके इसे हल कर सकता हूं।

आदर्श रूप से, एसएसएल भाग को सर्वर साइड में प्रबंधित किया जाना चाहिए। SSL के लिए क्लाइंट को कोई प्रमाणपत्र स्थापित करने की आवश्यकता नहीं है। साथ ही, क्लाइंट कोड से SSL को दरकिनार करने के बारे में कुछ पोस्ट का उल्लेख किया गया है। लेकिन मैं इससे पूरी तरह असहमत हूं।


3

मैंने सिर्फ "विश्वसनीय रूट प्रमाणीकरण प्राधिकारी" फ़ोल्डर में प्रमाण पत्र को घसीटा और सब कुछ अच्छी तरह से काम किया।

ओह। और मैंने पहली बार एक प्रशासक कमांड प्रॉम्प्ट से निम्नलिखित जोड़ा:

netsh http add urlacl url=https://+:8732/Servicename user=NT-MYNDIGHET\INTERAKTIV

मैं उस नाम के बारे में सुनिश्चित नहीं हूँ जो आपको उपयोगकर्ता के लिए आवश्यक है (मेरा प्रेमिका है जैसा कि आप देख सकते हैं!): user=NT-AUTHORITY/INTERACTIVE ?

आप सभी मौजूदा urlacl को कमांड जारी करके देख सकते हैं: netsh http show urlacl


0

WCF सेवा के माध्यम से कनेक्ट करने का प्रयास करते समय यह हुआ। IP उदाहरण के https://111.11.111.1:port/MyService.svcलिए mysite.com जैसे नाम से बंधे प्रमाण पत्र का उपयोग करते समय।

https://mysite.com:port/MyService.svcइसे हल करने के लिए स्विचिंग ।


0

WCF सेवा से कनेक्ट करने का प्रयास करते समय यह केवल होस्ट नाम जैसे कि https: //host/MyService.svc का उपयोग करते हुए होता है, जबकि एक नाम जैसे host.mysite.com से जुड़े प्रमाण पत्र का उपयोग किया जाता है।

Https://host.mysite.com/MyService.svc पर स्विच करना और इसने इसे हल कर दिया।


0

बस एक समान मुद्दा तय किया।

मुझे एहसास हुआ कि मेरे पास एक एप्लिकेशन पूल था जो एक खाते के तहत चल रहा था जो केवल उस प्रमाण पत्र पर पढ़ने की अनुमति थी जिसे इसका उपयोग किया गया था।

.NET एप्लिकेशन सही तरीके से प्रमाण पत्र प्राप्त कर सकता है, लेकिन उस अपवाद को केवल तभी फेंक दिया गया जब GetRequestStream () को कॉल किया गया।

प्रमाणपत्र अनुमतियों को MMC कंसोल के माध्यम से प्रबंधित किया जा सकता है


0

यदि आप .net कोर का उपयोग कर रहे हैं, तो विकास के दौरान आप कंपाइलर निर्देशों का उपयोग करके प्रमाणपत्र सत्यापन को बायपास कर सकते हैं। यह तरीका केवल प्रमाण पत्र जारी करने के लिए मान्य होगा और डिबग के लिए नहीं:

#if (DEBUG)
        client.ClientCredentials.ServiceCertificate.SslCertificateAuthentication =
                new X509ServiceCertificateAuthentication()
                {
                    CertificateValidationMode = X509CertificateValidationMode.None,
                    RevocationMode = System.Security.Cryptography.X509Certificates.X509RevocationMode.NoCheck
                };   #endif

-6

इसे अपने ग्राहक कोड में जोड़ें:

ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(
    delegate
    {
        return true;
    });

4
यह उत्तर बहुत अच्छा नहीं है, क्योंकि यह कोड से जुड़े जोखिमों की व्याख्या नहीं करता है।
daveD
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.