X509Store प्रमाणपत्र के साथ समस्या। FindByThumbprint को खोजें


84

जब मैं विधि का उपयोग करता हूं तो मुझे समस्या हो रही है X509Store.Certificates.Find

public static X509Certificate2 FromStore(StoreName storeName, 
          StoreLocation storeLocation, X509FindType findType, string findValue)
{
    X509Store store = new X509Store(storeName, storeLocation);
    store.Open(OpenFlags.ReadOnly);
    try
    {
        //findValue = "7a6fa503ab57b81d6318a51ca265e739a51ce660"
        var results = store.Certificates.Find(findType, findValue, true);

        return results[0];                
    }
    finally
    {
        store.Close();
    }
}

इस स्थिति में फाइंड मेथड 0 रिजल्ट ( results.Count == 0) देता है, लेकिन अगर मैं फाइंडवैल्यू को स्थाई मानकर सर्टिफिकेट ढूंढता हूं।

public static X509Certificate2 FromStore(StoreName storeName, 
           StoreLocation storeLocation, X509FindType findType, string findValue)
{
    X509Store store = new X509Store(storeName, storeLocation);
    store.Open(OpenFlags.ReadOnly);
    try
    {         
        //findValue= "7a6fa503ab57b81d6318a51ca265e739a51ce660"
        var results = store.Certificates.Find(findType, 
                              "7a6fa503ab57b81d6318a51ca265e739a51ce660", true);
        return results[0];
    }
    finally
    {
        store.Close();
    }
}

जवाबों:


135

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


मैं आज खुद इस अजीब व्यवहार के अधीन था, और मुझे यह पता लगाने में एक घंटे से अधिक समय लगा। जिस तरह से मैं अंत में इसे देखा लंबाई और के हैश कोड की जाँच करने के डिबगर का उपयोग करके किया गया था findValueऔर के Thumbprintप्रमाण पत्र वस्तु है, जो निकला अलग होने की की। यह मुझे डिबगर में उन तारों के चरित्र सरणियों का निरीक्षण करने के लिए ले गया, जहां अदृश्य चरित्र दिखाई दिया।


4
री-टाइपिंग की तुलना में एक आसान तरीका यह है कि प्रमाण पत्र प्रबंधन कंसोल डायलॉग से थंबप्रिंट कॉपी करें और इसे एक टेक्स्ट एडिटर (जैसे नोटपैड ++) में पेस्ट करें, जिस बिंदु पर अदृश्य यूनिकोड चरित्र "के रूप में दिखाई देगा?" या कुछ अन्य स्पष्ट रूप से विषम चरित्र। फिर आप उस चरित्र को निक्स कर सकते हैं और 'अपडेटेड' स्ट्रिंग को अपने कोड / कॉन्फिगर / टेक्स्टबॉक्स में कॉपी कर सकते हैं।
नैटविरिन

2
@nateirvin: यह सच है (हाथ से पीछे हटने का मेरा सुझाव थोड़ा अधिक है, और मैं उस बिंदु पर कितना निराश था, इससे प्रेरित था) - या इसे UTF-8 मोड में पेस्ट करें और छिपे हुए पात्रों के प्रदर्शन को चालू करें (जो और भी दिलचस्प है क्योंकि यह आपको दिखाता है कि यह कौन सा चरित्र है)।
अनसमुंड एल्डहुसेट 20

1
@ मेरा मानना ​​है कि यदि आप आसपास के उद्धरण (जैसा कि मैंने लिखा है) को हटा दें, तो इसे हटा दिया जाएगा, लेकिन वास्तव में, पूरी पंक्ति को हटाने से निश्चित रूप से इसे हटा देना चाहिए।
अनसमुंड एल्डहुसेट 17

1
बग ने यहां
सपोर्ट किया

3
रिकॉर्ड के लिए अंगूठा असंवेदनशील है। VS2015 और नोटपैड में भी मैं अदृश्य चरित्र को हटाने के लिए सिर्फ डिलीट हिट करने में सक्षम था - और यह सत्यापित करें कि कर्सर कुंजियों के साथ पहले स्थान पर था
साइमन_वेवर

49

मैंने कुछ उत्तरों को यहां लिया और उन्हें एक स्थिर विधि में संयोजित किया जो विशेष पात्रों और ऊपरी मामलों को दूर करने का ध्यान रखता है। उम्मीद है कि कोई और इसका इस्तेमाल कर सकता है।

    public static X509Certificate2 GetCertificate(string thumbprint)
    {
        // strip any non-hexadecimal values and make uppercase
        thumbprint = Regex.Replace(thumbprint, @"[^\da-fA-F]", string.Empty).ToUpper();
        var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);

        try
        {
            store.Open(OpenFlags.ReadOnly);

            var certCollection = store.Certificates;
            var signingCert = certCollection.Find(X509FindType.FindByThumbprint, thumbprint, false);
            if (signingCert.Count == 0)
            {
                throw new FileNotFoundException(string.Format("Cert with thumbprint: '{0}' not found in local machine cert store.", thumbprint));
            }

            return signingCert[0];
        }
        finally
        {
            store.Close();
        }
    }

2
इसे उत्तर के रूप में स्वीकार किया जाना चाहिए। अच्छी तरह से काम!!
ऐस्टर वीगस

6
यह Regex.Replace होना चाहिए "[^ \ da-fA-F]" - अंगूठे के निशान हेक्साडेसिमल तार हैं।
रॉस पैटरसन

धन्यवाद, कि रेगेक्स ने सिर्फ आधे घंटे के लिए कोड पर शपथ लेने के बाद मेरे द्वारा हल की गई समस्या को हल किया।
फ्राँस

उस कष्टप्रद गुप्त-छिपे-पात्र वूडू से निपटने के लिए अच्छा रेगेक्स ...
ग्रानडाकोडर

23

मेरे पास एक ही समस्या थी और इसे हल किया:

  1. मैंने फिंगरप्रिंट को mmc से सीधे VS पर कॉपी किया। मैंने तार की तुलना की और कोई अंतर नहीं पाया।

  2. हैश.लिफ्ट के साथ लंबाई की जाँच करते हुए, 41 बनाम 40 का अंतर था।

Mmc से कॉपी करके स्ट्रिंग में जोड़ा गया एक अदृश्य चार है।


सुलझाने:

  1. mmc से Notepad.exe पर फिंगरप्रिंट कॉपी करें
  2. इस स्ट्रिंग को फिर से कॉपी करें
  3. अपने कोड पर पेस्ट करें

यह काम कर रहा है।


10

इसने मुझे भी उलझा दिया, मैंने एमएमसी से कॉपी और पेस्ट किए जाने पर अंगूठे को साफ करने के लिए यह फ़ंक्शन लिखा था:

public string CleanThumbprint(string mmcThumbprint)
    {
        //replace spaces, non word chars and convert to uppercase
        return Regex.Replace(mmcThumbprint, @"\s|\W", "").ToUpper();
    }

...
        var myThumbprint = CleanThumbprint("‎b3 ab 84 e5 1e e5 e4 75 e7 a5 3e 27 8c 87 9d 2f 05 02 27 56");
        var myCertificate = certificates.Find(X509FindType.FindByThumbprint, myThumbprint, true)[0];

9

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

  1. प्रमुख विशेष चरित्र निकालें,
  2. वर्ण समूहों के बीच व्हाट्सएप निकालें,
  3. सभी वर्णों को अपरकेस में बदलें ।

3

यह कोड काम करना चाहिए।

मुझे लगता है कि आपने प्रमाणपत्र प्रबंधन कंसोल से इस थंबप्रिंट की प्रतिलिपि बनाई है। और उस कॉपी किए गए मान में यूनिकोड गैर-पठनीय प्रतीक होता है जो विज़ुअल स्टूडियो में अदृश्य होता है। पहले अदृश्य प्रतीक को हटाने की कोशिश करें और अगर मैं ऐसा सोचता हूं, तो यह काम करना चाहिए।


2

मैं इसी बात में भाग गया। मुझे यह उत्तर कहीं भी नहीं मिला, इसलिए मैं इसे पोस्ट करूँगा। यह मेरे लिए लगता है कि X509Store फंक्शन सिर्फ काम नहीं कर रहा था। मैंने इसे लूप के लिए एक साधारण से सत्यापित किया और प्रमाण पत्र को मैन्युअल रूप से प्राप्त किया।

  X509Store store = new X509Store(StoreName.Root,StoreLocation.LocalMachine);
        store.Open(OpenFlags.ReadOnly);
        X509Certificate cert = new X509Certificate();
        for (int i = 0; i < store.Certificates.Count; i++)
        {
            if (store.Certificates[i].SerialNumber == "XXXX")
            {
                cert = store.Certificates[i];
            }
        }

1

नीचे दिए गए स्टोर में अपना प्रमाण पत्र खोजने के लिए कोड बदलें:

var results = store.Certificates.Find(findType, findValue, true); 

साथ ही तीसरा पैराम जो बूल रिटर्न सर्टिफिकेट है तभी सर्टिफिकेट मान्य होगा। इसलिए सुनिश्चित करें कि आपका प्रमाणपत्र वैध है। यदि आपके पास एक स्व-हस्ताक्षरित प्रमाण पत्र है या तो बस "झूठा" होने के लिए 3 पारम पास करें


सर्टिफिकेट मान्य है, जब एक पुट हार्डकोडेड होता है, तो विधि 1 वैल्यू रिटर्न देता है = store.Certports.Find (findType, "7a6fa503ab57b81d6318a51ca265e739a51n660", true); //result.Count = 1 :)
nunofamel

क्या आप जांच सकते हैं कि रनटाइम आईडी क्या है जो विधि के लिए रनटाइम पर पारित किया जा रहा है?
राजेश

यह सही है कि मैंने उन्हें इमीडिएट खिड़कियों पर रखा, और उनका एक ही मूल्य है :(
नूनोफैमेल

क्या आपने अपने कोड में ऊपर दिखाए अनुसार सिंटैक्स को बदल दिया है?
राजेश

अब अंग्रेजी में :) मेरे आवेदन में मूल कोड ऊपर की तरह है, यह सिर्फ एक कॉपी + पेस्ट त्रुटि थी :)
nunofamel

1

यहाँ उपरोक्त सुझावों के लिए कोड का सरल संस्करण दिया गया है- मेरे लिए काम किया जाता है

 private X509Certificate2 GetCertificate()
    {
        var certStore = new X509Store("my");
        certStore.Open(OpenFlags.ReadOnly);
        try
        {
            const string thumbprint = "18 33 fe 3a 67 d1 9e 0d f6 1e e5 d5 58 aa 8a 97 8c c4 d8 c3";
            var certCollection = certStore.Certificates.Find(X509FindType.FindByThumbprint,
            Regex.Replace(thumbprint, @"\s+", "").ToUpper(), false);
            if (certCollection.Count > 0)
                return certCollection[0];
        }
        finally
        {
            certStore.Close();
        }
        return null;
    }

1

मैं इस अदृश्य यूनिकोड चार का सामना करता हूं। नोटपैड (विंडोज 10) का उपयोग करने की कोशिश करना किसी भी तरह से मेरे लिए अच्छा नहीं था। अंत में, मैं क्लीन थंबप्रिंट हेक्स प्राप्त करने के लिए पावरशेल का उपयोग करता हूं:

PS C:\> $tp= (Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {$_.Subject -match "mycert"}).Thumbprint;
PS C:\> $tp

यूनिकोड चार के लिए बहुत कुछ।


0
var results = store.Certificates.Find(findType, findType, true);

मुझे लगता है कि आप 2 वें परम का अर्थ है "findValue"।


2 परम वास्तव में findValue है,
nunofamel

अगर ऐसा है, तो समस्या कहीं और है। एक शाब्दिक स्ट्रिंग बनाम एक स्ट्रिंग वैरिएबल पैरामीटर इस तरह से टूटने वाला नहीं है जब तक कि वास्तविक सामग्री अलग नहीं है (व्हाट्सएप और नई रूपरेखा?)
जो

0

बस आपको यह बताने के लिए कि अदृश्य चरित्र क्या है, मैं देखता हूं कि एमएमसी में अंगूठे का निशान: 75 3 ए ...

फिर मैं इसे अपने विम में कॉपी और पेस्ट करता हूं, मैं निम्नलिखित देखता हूं:

<200e> 75 3 ए ...

तो आप पहले चार "<200e>" और अतिरिक्त रिक्त स्थान से छुटकारा पाने के बाद, आप ठीक हो जाएंगे।


0

Aasmund Eldhuset के उत्तर के लिए +1 (और अन्य उत्तर)।

वार्षिक रूप से, थंबप्रिंट टेक्स्टबॉक्स में पहला वर्ण अदृश्य यूनिकोड "बाएं-से-दाएं-निशान" नियंत्रण चरित्र है।

यह सत्यापित करना कठिन हो सकता है कि यह मौजूद है। उदाहरण के लिए, वी.एस. बाइनरी संपादक के लिए मेरी कॉन्फिगर फाइल से थंबप्रिंट कॉपी करने से कभी-कभी अदृश्य चरित्र मिलता है और कभी-कभी नहीं।

साथ ही यह कोड एक समस्या दिखाने में विफल रहा। मैंने कोड के माध्यम से कदम रखा और x509Store के ऊपर जो मुझे चाहिए था उसे खोजने के लिए मूस किया।

                X509Certificate2 cert2 = null;
                string storeName = StoreName.My.ToString();
                var x509Store = new X509Store(storeName, StoreLocation.LocalMachine);
                x509Store.Open(OpenFlags.ReadOnly);

                var cert3 = x509Store.Certificates[4];
                var thumbprint3 = cert3.Thumbprint;
                int gotIt = thumbprint3.CompareTo(clientCert);

0

लंबे विश्लेषण के बाद, यहां मेरे लिए काम किया गया है।

  1. प्रमाण पत्र से नोटपैड तक अंगूठे के प्रिंट की प्रतिलिपि बनाएँ।
  2. नोटपैड से विज़ुअल स्टूडियो तक अंगूठे के प्रिंट की प्रतिलिपि बनाएँ।
  3. व्यवस्थापक के रूप में दृश्य स्टूडियो चलाएँ।

यह एक आकर्षण की तरह काम करता है।

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