.NET के HttpWebRequest / Response के साथ स्व-हस्ताक्षरित प्रमाणपत्र का उपयोग करना


80

मैं एक ऐसे एपीआई से जुड़ने की कोशिश कर रहा हूं जो स्व-हस्ताक्षरित एसएसएल प्रमाणपत्र का उपयोग करता है। मैं .NET के HttpWebRequest और HttpWebResponse ऑब्जेक्ट का उपयोग कर रहा हूं। और मुझे एक अपवाद मिल रहा है कि:

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

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

तो, मैं इस स्व-हस्ताक्षरित प्रमाणपत्र के अपवाद को कैसे जोड़ूं? या क्या HttpWebRequest / Response बताने के लिए दृष्टिकोण प्रमाण पत्र को मान्य नहीं करता है? मुझे यह कैसे करना है?

जवाबों:


81

@Domster: जो काम करता है, लेकिन आप प्रमाणपत्र की हैश से मिलान करते हैं कि आप क्या उम्मीद करते हैं, यह जाँच कर सुरक्षा के लिए थोड़ा सा लागू करना चाहते हैं। तो एक विस्तारित संस्करण कुछ ऐसा दिखता है (कुछ लाइव कोड के आधार पर जो हम उपयोग कर रहे हैं):

static readonly byte[] apiCertHash = { 0xZZ, 0xYY, ....};

/// <summary>
/// Somewhere in your application's startup/init sequence...
/// </summary>
void InitPhase()
{
    // Override automatic validation of SSL server certificates.
    ServicePointManager.ServerCertificateValidationCallback =
           ValidateServerCertficate;
}

/// <summary>
/// Validates the SSL server certificate.
/// </summary>
/// <param name="sender">An object that contains state information for this
/// validation.</param>
/// <param name="cert">The certificate used to authenticate the remote party.</param>
/// <param name="chain">The chain of certificate authorities associated with the
/// remote certificate.</param>
/// <param name="sslPolicyErrors">One or more errors associated with the remote
/// certificate.</param>
/// <returns>Returns a boolean value that determines whether the specified
/// certificate is accepted for authentication; true to accept or false to
/// reject.</returns>
private static bool ValidateServerCertficate(
        object sender,
        X509Certificate cert,
        X509Chain chain,
        SslPolicyErrors sslPolicyErrors)
{
    if (sslPolicyErrors == SslPolicyErrors.None)
    {
        // Good certificate.
        return true;
    }

    log.DebugFormat("SSL certificate error: {0}", sslPolicyErrors);

    bool certMatch = false; // Assume failure
    byte[] certHash = cert.GetCertHash();
    if (certHash.Length == apiCertHash.Length)
    {
        certMatch = true; // Now assume success.
        for (int idx = 0; idx < certHash.Length; idx++)
        {
            if (certHash[idx] != apiCertHash[idx])
            {
                certMatch = false; // No match
                break;
            }
        }
    }

    // Return true => allow unauthenticated server,
    //        false => disallow unauthenticated server.
    return certMatch;
}

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

4
@ BrainSlugs83: अक्षम करना निश्चित रूप से एक विकल्प भी है, लेकिन मशीन-स्तरीय रूट प्राधिकरण स्टोर में प्रमाण पत्र को जोड़ना केवल प्रशासकों द्वारा किया जा सकता है। मेरा समाधान दोनों तरह से काम करता है।
devstuff

और मैं पूरी तरह से समझता हूं, लेकिन आपने पूछा, और यह अभी भी मेरा अनुमान है कि किसी ने आपके जवाब को वोट क्यों दिया। और यह अधिक काम होने की परवाह किए बिना, IMHO wgthom का जवाब नीचे अभी भी सबसे सही है।
ब्रेनस्ल्गस83

btw, सावधान रहें, मुझे लगता है कि ServerCertificateValidationCallback STATIC है, और थ्रेडलोकल भी नहीं। अगर मैं गलत नहीं हूं, तो एक बार सेट करने के बाद, यह तब तक सेट रहता है जब तक आप इसे साफ नहीं करते। यदि आप इसे केवल एक कनेक्शन के लिए और अन्य सभी में उपयोग करना चाहते हैं, तो समानांतर अनुरोधों के साथ बहुत सावधान रहें ..
quetzalcoatl

3
यह ऐसा करने का सबसे अच्छा तरीका है। यदि आप sslPolicyErrors के विरुद्ध चेक हटाते हैं, तो आप वास्तव में सुनिश्चित कर सकते हैं कि एपीआई प्रमाणपत्र हमेशा अपेक्षित है। एक बात का ध्यान रखें कि ऊपर दिए गए कोड में प्रमाणपत्र फिंगरप्रिंट एक बाइट सरणी है। यह लिखित रूप में संकलित नहीं होगा। इसके बजाय एक स्थैतिक आसानी से बाइट सरणी का प्रयास करें। संकलक इस पर चुटकी लेता है क्योंकि इसके लिए नए () ऑपरेटर की आवश्यकता होती है।
सेंटीजो

92

यदि आप प्रमाणपत्र प्रमाणपत्र को पूरी तरह से निष्क्रिय करना चाहते हैं, तो आप इसे बदल सकते हैं, आप ServerPoint सर्टिफिकेशन कॉलबैक को ServicePointManager पर बदल सकते हैं, जैसे:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

यह सभी प्रमाण पत्रों (अमान्य, समाप्त या स्व-हस्ताक्षरित सहित) को मान्य करेगा।


2
विकास मशीनों के खिलाफ कुछ त्वरित परीक्षण के लिए बिल्कुल सही। धन्यवाद।
नैट

2
यह किस स्कोप को प्रभावित करता है - एपडोमेन में सब कुछ? ऐप्पल पर सब कुछ? मशीन पर सब कुछ?
कोडुलिक

29
लेकिन लापरवाह रहो! आरएल अनुभव बताता है कि यह विकास हैक अक्सर इसे रिलीज उत्पाद में बदल देता है: दुनिया में सबसे खतरनाक कोड
डूमजुनकी

4
यह विकास में एक हैक उपयोगी है इसलिए #if DEBUG #endif स्टेटमेंट डालना इसके आसपास कम से कम आपको इस सुरक्षित बनाने के लिए और उत्पादन में इस समाप्ति को रोकने के लिए करना चाहिए।
एंडी

3
जब तक यह आदमी इस उत्तर को नहीं हटाता है, हम एक मज़ेदार तथ्य देखेंगे कि एक गलत उत्तर सही एक की तुलना में कहीं अधिक वोट प्राप्त करता है।
लेक्स ली

47

ध्यान दें कि, .NET 4.5 में आप HttpWebRequest प्रति SSL सत्यापन को ओवरराइड कर सकते हैं (और वैश्विक प्रतिनिधि के माध्यम से नहीं जो सभी अनुरोधों को प्रभावित करता है):

http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.servercertificatevalidationcallback.aspx

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
request.ServerCertificateValidationCallback = delegate { return true; };

1
कृपया इसे बढ़ाएँ; यह 4.5 के लिए उन्नयन के लायक है!
लिन क्रम्बलिंग

1
@FlorianWinter हाँ, आपको उपयोगकर्ता के तर्क से तर्क को अपनाना होगा
समर-टाइम

43

स्थानीय कंप्यूटर विश्वसनीय रूट प्रमाणीकरण प्राधिकारी के लिए स्व हस्ताक्षरित प्रमाण पत्र जोड़ें

आप MMC को व्यवस्थापक के रूप में चलाकर प्रमाणपत्र आयात कर सकते हैं।

कैसे करें: एमएमसी स्नैप-इन के साथ प्रमाण पत्र देखें


4
IMHO यह सबसे सही तरीका है; लोग बहुत आलसी हैं, इसलिए वे उन चीजों के लिए विशेष अपवादों में कोड करते हैं जो उन्हें शायद नहीं चाहिए।
ब्रेनस्ल्गस83

4
क्या यह तरीका विंडोज मोबाइल 6.5 के लिए काम करता है? 7 के बारे में कैसे? मेरे मामले में, मैं नहीं चाहता था कि मैं हर उस मोबाइल डिवाइस पर एक स्थानीय प्रमाणपत्र जोड़ूं जिसे मैंने एक विकास संस्करण चलाने की योजना बनाई थी। इस मामले में एक अच्छा अपवाद, तैनाती को एक टन आसान बनाता है। आलस्य या दक्षता, आप मुझे बताएं।
डोमिनिक शेहर्लिनक

3
@domster आप एक कारण के लिए SSL सेर का उपयोग कर रहे हैं - समापन बिंदुओं को सत्यापित करने के लिए यदि आप ऐसा कोड विकसित करते हैं जो विशेष रूप से उसके आसपास काम करता है, तो आप इसे ठीक से नहीं परख रहे हैं और उस कोड को एक जीवित वातावरण में लीक करने का जोखिम उठा रहे हैं। यदि क्लाइंट पर एक प्रमाण पत्र स्थापित करना वास्तव में बहुत काम है, तो सभी उपकरणों द्वारा जारी किए गए एक जारीकर्ता से प्रमाणित के लिए भुगतान क्यों नहीं किया जाता है?
बेसिक

1
@ बासिक यदि मुझे यह विशिष्ट मामला याद है, तो मुझे कई वाइल्डकार्ड सेर्ट्स की आवश्यकता होगी (इसमें आधा दर्जन टीएलडी शामिल थे, जो हमारे नियंत्रण में हैं)। यह एक विकास के माहौल के लिए एक मुश्किल से औचित्य है। इस मामले में, एकमात्र कोड "चारों ओर काम" किया जा रहा है और परीक्षण नहीं किया गया है कि एक अपवाद नहीं फेंका गया है जहां यह अन्यथा होगा। चाहे आप इस समाधान का उपयोग कर रहे हों, आपको उस विशिष्ट अपवाद पथ का परीक्षण करना चाहिए। और, अंत में, यदि आप विकास कोड को उत्पादन से बाहर नहीं रख सकते हैं, तो आपको SSL सत्यापन की तुलना में बहुत बड़ी समस्याएं हैं।
डोमिनिक शेहर्लिनक

वेबएप के लिए, अपने ऐपपूल को रीसायकल करना या अपनी वेबसाइट को पुनः आरंभ करना सुनिश्चित करें। व्यक्तिगत रूप से, मैं अभी recompiled, और फिर यह काम किया। हमारे wsdl सामान के लिए, प्रमाणपत्र सत्यापन आरंभीकरण और कैश्ड पर होता है।
सोनज्ज़

35

डॉम्स्टर के उत्तर में उपयोग किए गए सत्यापन कॉलबैक का दायरा ServerCertificateValidationCallbackप्रतिनिधि पर प्रेषक पैरामीटर का उपयोग करके एक विशिष्ट अनुरोध तक सीमित हो सकता है । निम्न साधारण स्कोप वर्ग इस तकनीक का उपयोग अस्थायी रूप से एक सत्यापन कॉलबैक को तार करने के लिए करता है जो केवल किसी दिए गए अनुरोध ऑब्जेक्ट के लिए निष्पादित करता है।

public class ServerCertificateValidationScope : IDisposable
{
    private readonly RemoteCertificateValidationCallback _callback;

    public ServerCertificateValidationScope(object request,
        RemoteCertificateValidationCallback callback)
    {
        var previous = ServicePointManager.ServerCertificateValidationCallback;
        _callback = (sender, certificate, chain, errors) =>
            {
                if (sender == request)
                {
                    return callback(sender, certificate, chain, errors);
                }
                if (previous != null)
                {
                    return previous(sender, certificate, chain, errors);
                }
                return errors == SslPolicyErrors.None;
            };
        ServicePointManager.ServerCertificateValidationCallback += _callback;
    }

    public void Dispose()
    {
        ServicePointManager.ServerCertificateValidationCallback -= _callback;
    }
}

उपरोक्त कक्षा का उपयोग एक विशिष्ट अनुरोध के लिए सभी प्रमाणपत्र त्रुटियों को अनदेखा करने के लिए किया जा सकता है:

var request = WebRequest.Create(uri);
using (new ServerCertificateValidationScope(request, delegate { return true; }))
{
    request.GetResponse();
}

6
इस उत्तर को अधिक वोटों की आवश्यकता है :) यह एक HttpWebRequest ऑब्जेक्ट का उपयोग करके एकल अनुरोध के लिए प्रमाणपत्र सत्यापन को छोड़ने का सबसे उचित उत्तर है।
मैकजेनसेन

मैंने इसे जोड़ा और मुझे अब भी अनुरोध मिल रहा है: अनुरोध SSL / TLS सुरक्षित चैनल नहीं बना सका।
वाइकिंगबेन

7
यह वास्तव में एक बहु-थ्रेडेड वातावरण में समस्या को हल नहीं करता है।
हंस

1
माँ !!!, एक 5 साल पुरानी पोस्ट मेरा दिन बचाती है, मुझे अमान्य प्रमाणपत्र के साथ पुराने उपग्रह-मॉडेम-उपकरण से कनेक्ट करने में समस्या है !! धन्यवाद!!
विंडहेन

मैं उलझन में हूँ / थोड़ा चिंतित हूँ! क्या SslPolicyErrors.Noneउस मामले में वापस नहीं आ रहा है, जहां पिछली कॉलबैक का मतलब यह नहीं था कि हम डिफ़ॉल्ट नीति को 'सभी को स्वीकार' नीति के साथ खत्म कर रहे हैं? सीएफ इस सवाल का जवाब और इसके विभिन्न: stackoverflow.com/q/9058096 । मुझे यह बताते हुए बहुत खुशी होगी कि मैं गलत क्यों हूं और यह कोड ठीक है!
माइकबेटन

3

विषय और जारीकर्ता को शामिल करने के लिए सिर्फ भक्ति के उत्तर पर निर्माण ... टिप्पणियों का स्वागत ...

public class SelfSignedCertificateValidator
{
    private class CertificateAttributes
    {
        public string Subject { get; private set; }
        public string Issuer { get; private set; }
        public string Thumbprint { get; private set; }

        public CertificateAttributes(string subject, string issuer, string thumbprint)
        {
            Subject = subject;
            Issuer = issuer;                
            Thumbprint = thumbprint.Trim(
                new char[] { '\u200e', '\u200f' } // strip any lrt and rlt markers from copy/paste
                ); 
        }

        public bool IsMatch(X509Certificate cert)
        {
            bool subjectMatches = Subject.Replace(" ", "").Equals(cert.Subject.Replace(" ", ""), StringComparison.InvariantCulture);
            bool issuerMatches = Issuer.Replace(" ", "").Equals(cert.Issuer.Replace(" ", ""), StringComparison.InvariantCulture);
            bool thumbprintMatches = Thumbprint == String.Join(" ", cert.GetCertHash().Select(h => h.ToString("x2")));
            return subjectMatches && issuerMatches && thumbprintMatches; 
        }
    }

    private readonly List<CertificateAttributes> __knownSelfSignedCertificates = new List<CertificateAttributes> {
        new CertificateAttributes(  // can paste values from "view cert" dialog
            "CN = subject.company.int", 
            "CN = issuer.company.int", 
            "f6 23 16 3d 5a d8 e5 1e 13 58 85 0a 34 9f d6 d3 c8 23 a8 f4") 
    };       

    private static bool __createdSingleton = false;

    public SelfSignedCertificateValidator()
    {
        lock (this)
        {
            if (__createdSingleton)
                throw new Exception("Only a single instance can be instanciated.");

            // Hook in validation of SSL server certificates.  
            ServicePointManager.ServerCertificateValidationCallback += ValidateServerCertficate;

            __createdSingleton = true;
        }
    }

    /// <summary>
    /// Validates the SSL server certificate.
    /// </summary>
    /// <param name="sender">An object that contains state information for this
    /// validation.</param>
    /// <param name="cert">The certificate used to authenticate the remote party.</param>
    /// <param name="chain">The chain of certificate authorities associated with the
    /// remote certificate.</param>
    /// <param name="sslPolicyErrors">One or more errors associated with the remote
    /// certificate.</param>
    /// <returns>Returns a boolean value that determines whether the specified
    /// certificate is accepted for authentication; true to accept or false to
    /// reject.</returns>
    private bool ValidateServerCertficate(
        object sender,
        X509Certificate cert,
        X509Chain chain,
        SslPolicyErrors sslPolicyErrors)
    {
        if (sslPolicyErrors == SslPolicyErrors.None)
            return true;   // Good certificate.

        Dbg.WriteLine("SSL certificate error: {0}", sslPolicyErrors);
        return __knownSelfSignedCertificates.Any(c => c.IsMatch(cert));            
    }
}

3

किसी अन्य व्यक्ति की संभावित सहायता के रूप में जोड़ने के लिए ... यदि आप चाहते हैं कि उपयोगकर्ता को स्व-हस्ताक्षरित प्रमाणपत्र स्थापित करने के लिए संकेत दिया जाए, तो आप इस कोड (ऊपर से संशोधित) का उपयोग कर सकते हैं।

व्यवस्थापक अधिकारों की आवश्यकता नहीं है, स्थानीय उपयोगकर्ताओं पर निर्भर प्रोफ़ाइलों को स्थापित करता है:

    private static bool ValidateServerCertficate(
        object sender,
        X509Certificate cert,
        X509Chain chain,
        SslPolicyErrors sslPolicyErrors)
    {
        if (sslPolicyErrors == SslPolicyErrors.None)
        {
            // Good certificate.
            return true;
        }

        Common.Helpers.Logger.Log.Error(string.Format("SSL certificate error: {0}", sslPolicyErrors));
        try
        {
            using (X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser))
            {
                store.Open(OpenFlags.ReadWrite);
                store.Add(new X509Certificate2(cert));
                store.Close();
            }
            return true;
        }
        catch (Exception ex)
        {
            Common.Helpers.Logger.Log.Error(string.Format("SSL certificate add Error: {0}", ex.Message));
        }

        return false;
    }

यह हमारे आवेदन के लिए अच्छी तरह से काम करता है, और यदि उपयोगकर्ता कोई दबाता है, तो संचार काम नहीं करेगा।

अपडेट: २०१५-१२-११ - बदला हुआ स्टोरनाम। नाम बदलें। स्टोरनामे पर जाएं। मेरा - रूट के बजाय स्थानीय उपयोगकर्ताओं के स्टोर में इंस्टॉल हो जाएगा। कुछ सिस्टम पर रूट काम नहीं करेगा, भले ही आप "व्यवस्थापक के रूप में चलाएं"


अगर यह कॉम्पैक्ट फ्रेमवर्क winCE पर काम करता है तो यह बहुत बढ़िया होगा। store.Add (..) उपलब्ध नहीं है।
Dawit

1

ध्यान रखने वाली एक बात यह है कि ServicePointManager.ServerCertificateValidationCallback होने का मतलब यह नहीं है कि CRL चेक और सर्वरनाम सत्यापन नहीं किया गया है, यह केवल उनके परिणाम को ओवरराइड करने का साधन प्रदान करता है। इसलिए आपकी सेवा को अभी भी CRL प्राप्त करने में थोड़ा समय लग सकता है, आपको बाद में ही पता चलेगा कि यह कुछ जाँचों में विफल रही।


1

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

यह पता चला कि मैं अपने उपयोगकर्ता खाते के तहत चल रहा था, और यह प्रमाण पत्र मशीन स्टोर पर स्थापित किया गया था। इसके कारण वेब अपवाद इस अपवाद को फेंक देता है। समस्या को हल करने के लिए मुझे या तो व्यवस्थापक के रूप में चलना होगा या उपयोगकर्ता स्टोर पर प्रमाण पत्र स्थापित करना होगा और इसे वहां से पढ़ना होगा।

ऐसा लगता है कि C # मशीन स्टोर में प्रमाण पत्र खोजने में सक्षम है, भले ही इसका उपयोग वेब अनुरोध के साथ नहीं किया जा सकता है, और यह ओपी के अपवाद के परिणामस्वरूप वेब अनुरोध जारी होने के बाद फेंक दिया जाता है।


विंडोज सेवाओं के लिए आप प्रत्येक सेवा के लिए अलग प्रमाणपत्र कॉन्फ़िगरेशन सेटअप कर सकते हैं। यदि आप एक डेस्कटॉप ऐप नहीं बल्कि एक सेवा लिख ​​रहे हैं, तो CA प्रमाणपत्र को विशेष रूप से सेवा डेमॉन के लिए MMC में आयात किया जा सकता है। उपयोगकर्ता खाते और मशीन खाते के बीच अंतर क्या है? मैंने सोचा था कि मशीन खाते में सब कुछ स्वचालित रूप से उपयोगकर्ता पर लागू होता है।
ArticIceJuice

1

सबसे पहले - मैं माफी मांगता हूं, क्योंकि मैंने उस समाधान का उपयोग किया है जो @devstuff द्वारा वर्णित किया गया था। हालाँकि, मैंने इसे सुधारने के कुछ तरीके ढूंढ लिए हैं।

  • स्वयं-हस्ताक्षरित प्रमाणपत्रों को जोड़ना
  • प्रमाण पत्र के कच्चे डेटा द्वारा तुलना
  • वास्तविक प्रमाणपत्र प्राधिकारी सत्यापन
  • कुछ अतिरिक्त टिप्पणियाँ और सुधार

यहाँ मेरा संशोधन है:

private static X509Certificate2 caCertificate2 = null;

/// <summary>
/// Validates the SSL server certificate.
/// </summary>
/// <param name="sender">An object that contains state information for this validation.</param>
/// <param name="cert">The certificate used to authenticate the remote party.</param>
/// <param name="chain">The chain of certificate authorities associated with the remote certificate.</param>
/// <param name="sslPolicyErrors">One or more errors associated with the remote certificate.</param>
/// <returns>Returns a boolean value that determines whether the specified certificate is accepted for authentication; true to accept or false to reject.</returns>
private static bool ValidateServerCertficate(
        object sender,
        X509Certificate cert,
        X509Chain chain,
        SslPolicyErrors sslPolicyErrors)
{
    if (sslPolicyErrors == SslPolicyErrors.None)
    {
        // Good certificate.
        return true;
    }

    // If the following line is not added, then for the self-signed cert an error will be (not tested with let's encrypt!):
    // "A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider. (UntrustedRoot)"
    chain.ChainPolicy.VerificationFlags = X509VerificationFlags.AllowUnknownCertificateAuthority;

    // convert old-style cert to new-style cert
    var returnedServerCert2 = new X509Certificate2(cert);

    // This part is very important. Adding known root here. It doesn't have to be in the computer store at all. Neither do certificates.
    chain.ChainPolicy.ExtraStore.Add(caCertificate2);

    // 1. Checks if ff the certs are OK (not expired/revoked/etc) 
    // 2. X509VerificationFlags.AllowUnknownCertificateAuthority will make sure that untrusted certs are OK
    // 3. IMPORTANT: here, if the chain contains the wrong CA - the validation will fail, as the chain is wrong!
    bool isChainValid = chain.Build(returnedServerCert2);
    if (!isChainValid)
    {
        string[] errors = chain.ChainStatus
            .Select(x => String.Format("{0} ({1})", x.StatusInformation.Trim(), x.Status))
            .ToArray();

        string certificateErrorsString = "Unknown errors.";

        if (errors != null && errors.Length > 0)
        {
            certificateErrorsString = String.Join(", ", errors);
        }

        Log.Error("Trust chain did not complete to the known authority anchor. Errors: " + certificateErrorsString);
        return false;
    }

    // This piece makes sure it actually matches your known root
    bool isValid = chain.ChainElements
        .Cast<X509ChainElement>()
        .Any(x => x.Certificate.RawData.SequenceEqual(caCertificate2.GetRawCertData()));

    if (!isValid)
    {
        Log.Error("Trust chain did not complete to the known authority anchor. Thumbprints did not match.");
    }

    return isValid;
}

प्रमाणपत्र सेट करना:

caCertificate2 = new X509Certificate2("auth/ca.crt", "");
var clientCertificate2 = new X509Certificate2("auth/client.pfx", "");

पास करने का तरीका

ServerCertificateValidationCallback(ValidateServerCertficate)

client.pfx इस तरह से कुंजी और CERT के साथ उत्पन्न होता है:

openssl pkcs12 -export -in client.crt -inkey client.key -out client.pfx
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.