2015-12-31 5 views
5

मैं इंटरनेट पर पाया एक ही रास्ता आईआईएस से सभी प्रमाणपत्र मिल गया के लिए विशिष्ट के प्रमाण पत्र प्राप्त करने और मैं इसे की तरह निम्नलिखित (ग #) कार्य करें:कैसे बाध्यकारी सी #

var store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 
store.Open(OpenFlags.ReadOnly); 
store.Certificates; 

अब मैं एक प्राप्त करने की कोशिश विशिष्ट बाध्यकारी का विशिष्ट प्रमाणपत्र, मैं इसे सी # में कैसे कर सकता हूं?

उत्तर

6

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

ऐसा करने के लिए, आपको लाइब्रेरी का संदर्भ जोड़ने की आवश्यकता होगी जो %windir%\system32\inetsrv\Microsoft.Web.Administration.dll (नोट: आईआईएस 7 या नया स्थापित होना चाहिए) के तहत पाया जा सकता है। इसके बाद, आप प्रमाण पत्र प्राप्त करने के लिए निम्न की तरह कुछ कर सकते हैं:

ServerManager manager = new ServerManager(); 
Site yourSite = manager.Sites["yourSiteName"]; 

X509Certificate2 yourCertificate = null; 

foreach (Binding binding in yourSite.Bindings) 
{ 
    if (binding.Protocol == "https" && binding.EndPoint.ToString() == "127.0.0.1" /*your binding IP*/) 
    { 
     var store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 
     store.Open(OpenFlags.ReadOnly); 
     yourCertificate = store.Certificates.Find(X509FindType.FindByThumbprint, ToHex(binding.CertificateHash), true)[0]; 
     break; 
    } 
} 

public static string ToHex(byte[] ba) 
{ 
    var hex = new StringBuilder(ba.Length * 2); 
    foreach (byte b in ba) 
    { 
     hex.AppendFormat("{0:x2}", b); 
    } 

    return hex.ToString(); 
} 
+0

कि NuGet पैकेज माइक्रोसॉफ्ट आधिकारिक नहीं है और इसे टालना चाहिए। –

+0

वह फ़ील्ड किसी को भी सेट किया जा सकता है। प्रकाशक की जांच करें और आप देखेंगे। यह असेंबली हमेशा आईआईएस स्थापना फ़ोल्डर से जोड़ा जाना चाहिए। –

+1

पूरा पथ '% windir% \ system32 \ inetsrv \ Microsoft.Web.Administration.dll' है। कृपया इसका प्रयोग करें। –

-1

नीचे दिए गए लिंक की मदद करनी चाहिए:

मूल रूप से store.Certificates खास दुकान में सभी प्रमाण पत्र का एक संग्रह देता है, आप तो आप जो चाहते है के लिए के माध्यम से खोज सकते हैं। लिंक दिखाता है कि अगर आप अपने इच्छित प्रमाणपत्र का विषय नाम जानते हैं तो यह कैसे करें।

How to get X509Certificate from certificate store and generate xml signature data?

4

मुझे लगता है कि कैमिलो के उत्तर में एक छोटी सी समस्या है। जहां तक ​​मैं देख सकता हूं (परीक्षण किया गया) प्रमाण पत्र खोजने के लिए कोड काम नहीं करता है, क्योंकि System.Convert.ToBase64String(binding.CertificateHash) एक वैध प्रमाणपत्र थंबप्रिंट वापस नहीं करता है।

मेरे संस्करण:

/// <summary> 
    /// Returns the https certificate used for a given local IIS website. 
    /// </summary> 
    /// <param name="sWebsite">Website url, e.g., "https://myserver.company.com"</param> 
    /// <returns>certificate, null if not found</returns> 
    private X509Certificate2 FindIisHttpsCert(string sWebsite) 
    { 
     Uri uriWebsite = new Uri(sWebsite); 
     using (ServerManager sm = new ServerManager()) 
     { 
     string sBindingPort = string.Format(":{0}:", uriWebsite.Port); 
     Binding bdBestMatch = null; 
     foreach (Site s in sm.Sites) 
     { 
      foreach (Binding bd in s.Bindings) 
      { 
      if (bd.BindingInformation.IndexOf(sBindingPort) >= 0) 
      { 
       string sBindingHostInfo = bd.BindingInformation.Substring(bd.BindingInformation.LastIndexOf(':') + 1); 
       if (uriWebsite.Host.IndexOf(sBindingHostInfo, StringComparison.InvariantCultureIgnoreCase) == 0) 
       { 
       if ((bd.Protocol == "https") && ((bdBestMatch == null) || (bdBestMatch.BindingInformation.Length < bd.BindingInformation.Length))) 
        bdBestMatch = bd; 
       } 
      } 
      } 
     } 
     if (bdBestMatch != null) 
     { 
      StringBuilder sbThumbPrint = new StringBuilder(); 
      for (int i = 0; i < bdBestMatch.CertificateHash.Length; i++) 
      sbThumbPrint.AppendFormat("{0:X2}", bdBestMatch.CertificateHash[i]); 

      X509Store store = new X509Store(bdBestMatch.CertificateStoreName, StoreLocation.LocalMachine); 
      store.Open(OpenFlags.ReadOnly); 
      X509Certificate2Collection coll = store.Certificates.Find(X509FindType.FindByThumbprint, sbThumbPrint.ToString(), true); 
      if (coll.Count > 0) 
      return coll[0]; 
     } 
     } 
     return null; // if no matching site was found 
    } 

यह समारोह भी काम करता है यदि एक से अधिक https साइटों एक ही सर्वर पर होस्ट कर रहे हैं (परीक्षण किया) और साइट से 443 (परीक्षण नहीं) अन्य एक बंदरगाह का उपयोग करता है, तो काम करना चाहिए। बाध्यकारी जानकारी प्राप्त करने के लिए, %windir%\system32\inetsrv\Microsoft.Web.Administration.dll का उपयोग कैमिलो के उत्तर में किया जाता है।

+0

गुणों का उपयोग करके खोज करता है, मुझे एक ही त्रुटि का अनुभव होता है, और आपका कोड पूरी तरह से काम करता है! – Muis

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