এক্স 509 স্টোর শংসাপত্রগুলির সাথে সমস্যা Find


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();
    }
}

এই ক্ষেত্রে 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();
    }
}

উত্তর:


136

আমি মনে করি আপনি উইন্ডোজ শংসাপত্রের তথ্য সংলাপ বাক্স থেকে থাম্বপ্রিন্টটি আপনার কোডে অনুলিপি করেছেন (বা এটি কোনও সরল উদাহরণ হিসাবে কোনও কনফিগার ফাইলে)। বিরক্তিকরভাবে, থাম্বপ্রিন্ট পাঠ্যবাক্সের প্রথম অক্ষরটি হ'ল অদৃশ্য ইউনিকোড "বাম থেকে ডান-চিহ্ন" নিয়ন্ত্রণ অক্ষর । খোলার স্ট্রিং কোট এবং থাম্বপ্রিন্টের প্রথম অক্ষর নির্বাচন করে এগুলি মুছে ফেলুন (যা এর মধ্যে মাঝেই অদৃশ্য চরিত্র থেকে মুক্তি পাবে) এবং তাদের হাতে পুনরায় টাইপ করুন।


আমি আজ নিজেকে এই অদ্ভুত আচরণের শিকার হয়েছি এবং এটি বের করতে আমার এক ঘন্টা সময় লেগেছে। পথ পরিশেষে আমি দেখে লেন্থ এবং হ্যাশ কোড চেক করতে ডিবাগার ব্যবহার করে ছিল findValueএবং Thumbprintশংসাপত্র বস্তু, যার নিষ্কাশিত আলাদা হতে হয়। এটি আমাকে ডিবাগারের সেই স্ট্রিংগুলির চরিত্রের অ্যারেগুলি পরীক্ষা করতে পরিচালিত করেছিল, যেখানে অদৃশ্য চরিত্রটি প্রদর্শিত হয়েছিল।


4
পুনরায় টাইপ করার চেয়ে সহজ উপায় হ'ল শংসাপত্র পরিচালন কনসোল ডায়লগ থেকে থাম্বপ্রিন্টটি অনুলিপি করা এবং এটি একটি পাঠ্য সম্পাদক (নোটপ্যাড ++ এর মতো) তে আটকানো, যেখানে কোন অদৃশ্য ইউনিকোড অক্ষর "হিসাবে উপস্থিত হবে?" বা অন্য কিছু স্পষ্টতই বিজোড় চরিত্র। তারপরে আপনি সেই অক্ষরটিকে নিক্স করতে পারেন এবং আপনার কোড / কনফিগার / পাঠ্যবক্সে 'আপডেট হওয়া' স্ট্রিংটি অনুলিপি করতে পারেন।
nateirvin

4
@ নাটায়ারভিন: সত্য (হাত দিয়ে পুনরায় টাইপ করার জন্য আমার পরামর্শটি কিছুটা ওভারকিল, এবং আমি যে মুহুর্তে কতটা হতাশ হয়েছিল তা দ্বারা অনুপ্রাণিত হয়েছিলাম) - বা এটি ইউটিএফ -8 মোডে পেস্ট করুন এবং লুকানো অক্ষরের প্রদর্শন চালু করুন (যা আরও আকর্ষণীয় কারণ এটি আপনাকে সঠিকভাবে দেখায় যে এটি কোন চরিত্রের)।
আসমুন্ড এলদুয়েস্ট

4
@ জেমস আমি বিশ্বাস করি আপনি যদি আশেপাশের উক্তিগুলিও মুছে ফেলেন তবে এটি মুছে ফেলা হবে (যেমনটি আমি লিখেছি), তবে প্রকৃতপক্ষে পুরো লাইনটি মুছে ফেলা অবশ্যই এ থেকে মুক্তি পাওয়া উচিত।
আসমুন্ড এলদুয়েস্ট

4
এখানে বাগের নথিভুক্ত করা হয়েছে support.microsoft.com/en-us/kb/2023835 পাঠ এমএমসি থেকে অনুলিপি এবং আটকানো হয় না
ড্যারিল ব্রাটেন

4
রেকর্ডের জন্য থাম্বপ্রিন্ট হ'ল সংবেদনশীল। এছাড়াও ভিএস ২০১৫ এবং নোটপ্যাডে আমি কেবল অদৃশ্য চরিত্রটি মুছতে মুছতে মুছতে সক্ষম হয়েছি - এবং কার্সার কীগুলির সাহায্যে এটি সেখানে প্রথম স্থানে ছিল কিনা তা যাচাই করতে
পেরে

50

আমি এখানে কিছু উত্তর নিয়েছি এবং এগুলিকে একটি স্থিতিশীল পদ্ধতিতে একত্রিত করেছি যা বিশেষ অক্ষর এবং উপরের সমস্ত বিষয় মুছে ফেলার যত্ন নেয়। আশা করি অন্য কেউ এটি ব্যবহার করতে পারবেন।

    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();
        }
    }

4
এটি উত্তর হিসাবে গ্রহণ করা উচিত। পুরোপুরি কাজ করে !!
Aster Veigas

6
রিজেক্স। রিপ্লেসটি "[^ \ da-fA-F]" হওয়া উচিত - থাম্বপ্রিন্টগুলি হেক্সাডেসিমাল স্ট্রিং।
রস প্যাটারসন

ধন্যবাদ, এই রেজেক্স ঠিক আধ ঘন্টা ধরে কোডের শপথ করার পরে আমার যে সমস্যাটি হয়েছিল তা সমাধান করেছে।
ফ্রান্স

সেই বিরক্তিকর গোপন-গোপন অক্ষর
ভুডো মোকাবেলায় খুব ভাল লাগল

23

আমার একই সমস্যা ছিল এবং এটি সমাধান হয়েছে:

  1. আমি আঙুলের ছাপটি এমএমসি থেকে সরাসরি ভিএসে অনুলিপি করেছিলাম আমি স্ট্রিংগুলি তুলনা করেছিলাম এবং কোনও পার্থক্য পাইনি।

  2. হ্যাশ দৈর্ঘ্যের সাথে দৈর্ঘ্যটি পরীক্ষা করা, একটি পার্থক্য ছিল, 41 বনাম 40।

এমএমসি থেকে অনুলিপি করে স্ট্রিংটিতে একটি অদৃশ্য চর যুক্ত হয়েছে।


সমাধান:

  1. আঙ্গুলের ছাপটি এমএমসি থেকে নোটপ্যাড.এক্সে অনুলিপি করুন
  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 আউটপুট এছাড়াও ছোট অক্ষর এবং ফাঁকা স্থান ছিল। একটি ম্যাচ পেতে, আমাকে ফাইন্ডওয়ালুকে একটি স্ট্রিং হিসাবে নির্দিষ্ট করতে হয়েছিল যা রূপান্তরিত হয়েছে

  1. শীর্ষস্থানীয় বিশেষ চরিত্রটি সরান,
  2. অক্ষর গুচ্ছগুলির মধ্যে শ্বেত স্থানটি সরান,
  3. সমস্ত অক্ষর বড় হাতের অক্ষরে পরিবর্তন করুন ।

3

এই কোড কাজ করা উচিত।

আমি মনে করি আপনি শংসাপত্র পরিচালনা কনসোল থেকে এই থাম্বপ্রিন্ট অনুলিপি করেছেন। এবং সেই অনুলিপি মানটিতে ইউনিকোড অ-পঠনযোগ্য প্রতীক রয়েছে যা ভিজ্যুয়াল স্টুডিওতে অদৃশ্য। প্রথম অদৃশ্য প্রতীক মুছে ফেলার চেষ্টা করুন এবং এটি যদি আমি মনে করি তবে এটি কাজ করা উচিত।


2

আমি এই একই জিনিস মধ্যে দৌড়ে। আমি এই উত্তরটি এখানে কোথাও পাইনি তাই আমি এটি পোস্ট করব। আমার কাছে মনে হচ্ছে X509 স্টোর ফাংশনটি ঠিক ফ্ল্যাট কাজ করছে না। আমি লুপ এবং সর্টটি ম্যানুয়ালি পুনরুদ্ধারের জন্য একটি সাধারণ দ্বারা এটি যাচাই করেছি।

  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); 

এছাড়াও তৃতীয় পরম যা শংসাপত্র বৈধ হলে কেবল বোল রিটার্ন শংসাপত্র হয়। সুতরাং আপনার শংসাপত্রটি বৈধ কিনা তা নিশ্চিত করুন। আপনার যদি স্ব স্বাক্ষরিত শংসাপত্র বা তাই থাকে তবে "মিথ্যা" হতে কেবল ২ য় পরম পাস করুন


শংসাপত্রটি বৈধ, যখন কোনও পদ্ধতিতে হার্ডকোড দেওয়া থাকে তখন 1 মান ভের ফলাফল = স্টোর প্রদান করে er //result.Count = 1 :)
নুনোফামেল

আপনি কি থাম্বপ্রিন্ট আইডিটি যা রানটাইমে পদ্ধতিতে পাস হতে চলেছে তা পরীক্ষা করতে পারেন?
রাজেশ

ঠিক আছে আমি সেগুলি উইকেটে উইন্ডোতে রেখেছি এবং তার একই মান রয়েছে :(
নুনোফামেল

আপনি কি আপনার কোডটিতে উপরে বর্ণিত হিসাবে সিনট্যাক্সটিকে একটিতে পরিবর্তন করেছেন?
রাজেশ

এখন ইংরেজিতে :) আমার আবেদনের মূল কোডটি উপরের মত, এটি কেবল একটি অনুলিপি + পেস্ট ত্রুটি ছিল :)
নুনোফামেল

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);

আমি মনে করি আপনি "ফাইন্ডভ্যালু" হিসাবে দ্বিতীয় পারম বোঝাতে চাইছেন।


২ য় পরম আসলেই ফাইভ্যালু,
নুনোফামেল

যদি এটি হয় তবে সমস্যাটি অন্য কোথাও। একটি আক্ষরিক স্ট্রিং বনাম একটি স্ট্রিং ভেরিয়েবল প্যারামিটার যদি এমন না হয় তবে প্রকৃত বিষয়বস্তু আলাদা হয় না (হোয়াইটস্পেস? নতুন লাইনের পিছনে?)
জো

0

অদৃশ্য চরিত্রটি কী তা আপনাকে কেবল তা জানাতে, আমি মিমিচিতে থাম্বপ্রিন্টটি দেখছি: 75 3 এ ...

তারপরে আমি এটিকে আমার ভিমে অনুলিপি করে আটকান, আমি নিম্নলিখিতটি দেখছি

<200e> 75 3 এ ...

সুতরাং প্রথম চর "<200e>" এবং অতিরিক্ত স্থানগুলি থেকে মুক্তি পাওয়ার পরে আপনি ভাল থাকবেন।


0

আসমুন্ড এলদুয়েস্টের উত্তর (এবং অন্যান্য উত্তর) এর জন্য +1।

বিরক্তিকরভাবে, থাম্বপ্রিন্ট টেক্সটবক্সের প্রথম অক্ষরটি হ'ল অদৃশ্য ইউনিকোড "বাম থেকে ডান-চিহ্ন" নিয়ন্ত্রণ অক্ষর।

এটি উপস্থিত কিনা তা যাচাই করা শক্ত হতে পারে। উদাহরণস্বরূপ, আমার কনফিগারেশন ফাইল থেকে থাম্বপ্রিন্টটি ভিএস বাইনারি সম্পাদকে অনুলিপি করা কখনও কখনও অদৃশ্য চরিত্র পায় এবং কখনও কখনও হয় না।

এছাড়াও এই কোডটি কোনও সমস্যা দেখাতে ব্যর্থ হয়েছে। আমি কোডটি পা দিয়েছিলাম এবং আমার চাওয়া শংসাপত্রটি খুঁজতে x509 স্টোরের উপর দিয়ে শৈশব চাপিয়েছি।

                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. প্রশাসক হিসাবে ভিজ্যুয়াল স্টুডিও চালান।

এটি একটি কবজির মতো কাজ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.