2012-01-30 3 views
15

मैं आवेदन में कुछ स्व-हस्ताक्षरित प्रमाणपत्र पर विश्वास नहीं करने की जरूरत है, तो मैं इस तरह सत्यापन कॉलबैक ओवरराइड:सेवापॉइंट प्रबंधक को ओवरराइड करते समय डिफ़ॉल्ट प्रमाणपत्र जांच को कॉल करने के लिए कैसे करें। सर्वर पर सत्यापित करें प्रमाणीकरण वैधता Callback?

ServicePointManager.ServerCertificateValidationCallback = MyRemoteCertificateValidationCallback; 
... 

public static bool MyRemoteCertificateValidationCallback(
      Object sender, 
      X509Certificate certificate, 
      X509Chain chain, 
      SslPolicyErrors sslPolicyErrors) 
{ 

    if (sslPolicyErrors == SslPolicyErrors.None) 
     return true; 

    if (IsAprrovedByMyApplication(sender, certificate)) // <-- no matter what the check here is 
     return true; 
    else 
     return false; // <-- here I'd like to call the default Windwos handler rather than returning 'false' 
} 

लेकिन साइट मैं जोड़ने हूँ करने के लिए जब वहाँ कुछ नीति त्रुटियों कर रहे हैं, और द्वारा अनुमोदित नहीं है आवेदन, अपवाद फेंक दिया जाता है। यहां समस्या यह है कि यह मानक विंडोज व्यवहार से अलग है। https://www.dscoduc.com/

यह प्रमाण पत्र एक अज्ञात जारीकर्ता है, और इसलिए अविश्वसनीय:

इस साइट पर विचार करें। मैंने इसे स्थानीय कॉम्प्यूटर के विश्वसनीय लोगों (यह विंडोज 7) में एमएमसी के साथ जोड़ा है।

अगर मैं प्रमाणपत्र सत्यापन कॉलबैक अधिभावी के बिना इस कोड चलाएँ:

HttpWebRequest http = (HttpWebRequest)HttpWebRequest.Create("https://www.dscoduc.com/"); 
using (WebResponse resp = http.GetResponse()) 
{ 
    using (StreamReader sr = new StreamReader(resp.GetResponseStream())) 
    { 
     string htmlpage = sr.ReadToEnd(); 
    } 
} 

इसे सफलतापूर्वक जोड़ता है। इसका मतलब है कि विंडोज डिफ़ॉल्ट सत्यापनकर्ता ने इस प्रमाणपत्र पर भरोसा करने का फैसला किया है।

लेकिन एक बार मैं ServerCertificateValidationCallback ओवरराइड, मेरे कॉलबैक SslPolicyErrors.RemoteCertificateChainErrors और चेन के साथ कहा जाता है की स्थिति के साथ एक तत्व होता है X509ChainStatusFlags.PartialChain (वास्तव में मैं वर्तमान क्योंकि, यहां कोई त्रुटि प्राप्त करने के लिए उम्मीद करेंगे प्रमाण विश्वसनीय होना चाहिए)

यह साइट मेरी विश्वसनीय सूची में शामिल नहीं है, और मेरे कॉलबैक से 'सत्य' वापस नहीं करना चाहती। लेकिन मैं न तो 'झूठी' वापस नहीं करना चाहता, या मुझे अपवाद मिलेगा: "रिमोट प्रमाणपत्र प्रमाणीकरण प्रक्रिया के अनुसार अमान्य है", जिसे स्पष्ट रूप से https://www.dscoduc.com/ के लिए अपेक्षित नहीं है, क्योंकि यह विश्वसनीय लोगों की दुकान में जोड़ा गया है , और जब प्रमाणपत्र कॉलबैक ओवरराइड नहीं होता है तो विंडोज द्वारा अनुमोदित किया जाता है। तो मैं चाहता हूं कि विंडोज इस साइट के लिए डिफ़ॉल्ट सत्यापन प्रक्रिया ले। मैं खुद को विंडोज ट्रस्टेड स्टोर्स में देखना नहीं चाहता हूं और सभी चेन तत्वों के माध्यम से जाना चाहता हूं, क्योंकि यह विंडोज़ में पहले से ही (और उम्मीदपूर्वक सही ढंग से लागू) है।

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

ServicePointManager.ServerCertificateValidationCallback के लिए डिफ़ॉल्ट मान शून्य है, इसलिए बाद में कॉल करने के लिए मेरे लिए कोई 'डिफ़ॉल्ट' कॉलबैक नहीं है। मुझे यह 'डिफ़ॉल्ट' प्रमाण पत्र हैंडलर कैसे कॉल करना चाहिए?

धन्यवाद

उत्तर

6

यह कम मुश्किल से अपने कॉलबैक में से श्रृंखला चलने के लिए लगता है।

http://msdn.microsoft.com/en-us/library/dd633677(v=exchg.80).aspx

कि नमूने में कोड बाहर काम करने के यदि प्रमाणपत्र स्व-हस्ताक्षरित है और यदि हां, तो यह भरोसा प्रमाणपत्र श्रृंखला की जांच करता है पर एक नज़र डालें। आप इसे PartialChain को इसके बजाय या साथ ही स्वीकार करने के लिए अनुकूलित कर सकते हैं।आप कुछ इस तरह काम करना चाहते होता जा:

if (status.Status == X509ChainStatusFlags.PartialChain || 
    (certificate.Subject == certificate.Issuer && 
    status.Status == X509ChainStatusFlags.UntrustedRoot) 
{ 
    // Certificates with a broken chain and 
    // self-signed certificates with an untrusted root are valid. 
    continue; 
} 
else if (status.Status != X509ChainStatusFlags.NoError) 
{ 
    // If there are any other errors in the certificate chain, 
    // the certificate is invalid, so the method returns false. 
    return false; 
} 

वैकल्पिक रूप से, Subject संपत्ति का निरीक्षण:

private static bool CertificateValidationCallBack(
    object sender, 
    System.Security.Cryptography.X509Certificates.X509Certificate certificate, 
    System.Security.Cryptography.X509Certificates.X509Chain chain, 
    System.Net.Security.SslPolicyErrors sslPolicyErrors) 
{ 
    return certificate.Subject.Contains(".dsoduc.com"); 
} 
3

कुछ इस तरह काम कर सकते हैं। ध्यान दें X509CertificateValidator आपको यह चुनने की अनुमति देता है कि भरोसेमंद लोगों को सत्यापन में शामिल करना है या नहीं।

private static bool CertificateValidationCallBack(
    object sender, 
    X509Certificate certificate, 
    X509Chain chain, 
    SslPolicyErrors sslPolicyErrors) 
{ 
    // Your custom check here... 
    if (isYourSpecialCase) 
    { 
     return true; 
    } 

    // If it is not your special case then revert to default checks... 

    // Convert the certificate to a X509Certificate2 
    var certificate2 = certificate as X509Certificate2 ?? new X509Certificate2(certificate); 

    try 
    { 
     // Choose the type of certificate validation you want 
     X509CertificateValidator.PeerOrChainTrust.Validate(certificate2); 
     //X509CertificateValidator.ChainTrust.Validate(certificate2); 
    } 
    catch 
    { 
     return false; 
    } 

    // Sender is always either a WebReqest or a hostname string 
    var request = sender as WebRequest; 
    string requestHostname = request != null ? request.RequestUri.Host : (string)sender; 

    // Get the hostname from the certificate 
    string certHostname = certificate2.GetNameInfo(X509NameType.DnsName, false); 

    return requestHostname.Equals(certHostname, StringComparison.InvariantCultureIgnoreCase); 
} 
संबंधित मुद्दे