X509Store Sertifikalarıyla İlgili Sorunlar. FindByThumbprint Bul


84

Yöntemi kullanırken sorun yaşıyorum 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();
    }
}

Bu durumda Bul Yöntemi 0 sonuç ( results.Count == 0) döndürür , ancak findValue değerini sabit olarak koyarsam yöntem sertifikayı bulur.

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

Yanıtlar:


136

Windows sertifika bilgileri iletişim kutusundaki parmak izini kopyalayıp kodunuza (veya bu basitleştirilmiş bir örnekse bir yapılandırma dosyasına) yapıştırdığınızı varsayıyorum. Can sıkıcı bir şekilde, parmak izi metin kutusundaki ilk karakter, görünmez Unicode "soldan sağa işaretli" kontrol karakteridir . Açılış dizesi teklifini ve parmak izinin ilk karakterini seçmeyi, bunları silmeyi (aradaki görünmez karakterden de kurtulmayı sağlar) ve elle yeniden yazmayı deneyin.


Bugün kendim de bu garip davranışa maruz kaldım ve bunu anlamam bir saatten fazla sürdü. Sonunda gördü yol uzunlukları ve hash kodlarını kontrol etmek için hata ayıklayıcı kullanılarak yapıldı findValueve Thumbprintfarklı olduğu ortaya çıktı belgesi nesnesinin. Bu, görünmez karakterin ortaya çıktığı hata ayıklayıcıdaki bu dizelerin karakter dizilerini incelememe yol açtı.


4
Yeniden yazmaktan daha kolay bir yol, parmak izini sertifika yönetim konsolu iletişim kutusundan kopyalayıp bir metin düzenleyicisine (Notepad ++ gibi) yapıştırmaktır; bu noktada görünmez Unicode karakteri "?" Olarak görünecektir. ya da apaçık garip bir karakter. Daha sonra bu karakteri sıfırlayabilir ve 'güncellenmiş' dizeyi kod / yapılandırma / metin kutunuza kopyalayabilirsiniz.
nateirvin

2
@nateirvin: Doğru (elle yeniden yazma önerim biraz abartılı ve o noktada ne kadar sinirli olduğumdan ilham aldı) - veya UTF-8 moduna yapıştırın ve gizli karakterlerin görüntülenmesini açın (ki bu daha da ilginç çünkü size tam olarak hangi karakter olduğunu gösterir).
Aasmund Eldhuset

1
@James, çevreleyen alıntıları da silerseniz (yazdığım gibi) silineceğine inanıyorum, ama aslında, tüm satırı silmek kesinlikle ondan kurtulmalıdır.
Aasmund Eldhuset

1
Burada belgelenen hata support.microsoft.com/en-us/kb/2023835 dersi MMC'den kopyalayıp yapıştırmama
Darryl Braaten

3
kayıt için parmak izi büyük / küçük harf duyarlıdır. Sadece görünmez karakteri silmek için sil vurmayı da VS2015 ve not defteri ben başardı - imleç tuşları ile ilk etapta orada saymaya oldu
Simon_Weaver

50

Buradaki bazı cevapları aldım ve onları özel karakterleri ve büyük harfleri kaldırmaya özen gösteren statik bir yöntemde birleştirdim. Umarım başka biri kullanabilir.

    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
Bu cevap olarak kabul edilmelidir. Mükemmel çalışıyor!!
Aster Veigas

6
Bu Regex.Replace "[^ \ da-fA-F]" olmalıdır - parmak izleri onaltılık dizelerdir.
Ross Patterson

Teşekkürler, bu Regex kod üzerine yarım saat yemin ettikten sonra yaşadığım sorunu çözdü.
Fransızca


23

Aynı Sorunu yaşadım ve çözdüm:

  1. Parmak İzini mmc'den doğrudan VS'ye kopyaladım. Dizeleri karşılaştırdım ve herhangi bir fark bulamadım.

  2. Uzunluğu hash.length ile kontrol ederken, 41 ile 40 arasında bir fark vardı.

Dize, mmc'den kopyalanarak eklenen görünmez bir karakter var.


Çözme:

  1. Parmak İzini mmc'den Notepad.exe'ye kopyalayın
  2. bu dizeyi tekrar kopyala
  3. kodunuza yapıştırın

İşe yarıyor.


10

Bu beni de tetikledi, MMC'den kopyalanıp yapıştırıldığında parmak izini temizlemek için bu işlevi yazdım:

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

Bunun kurbanı oldum. Windows konsolunun parmak izinin ek bileşen ekranında yalnızca bir Unicode "soldan sağa" karakteri değil, aynı zamanda her iki karakter arasında boşluklar olan küçük harfli onaltılık karakterler de vardı. CertUtil'in çıktısı da küçük harfli karakterler ve boşluklara sahipti. Bir eşleşme elde etmek için findValue değerini, dönüştürülmüş bir dize olarak belirtmem gerekiyordu.

  1. Baştaki özel karakteri kaldırın,
  2. Karakter kümeleri arasındaki boşlukları kaldırın,
  3. Tüm karakterleri büyük harfe çevirin .

3

Bu kod çalışmalıdır.

Sanırım bu parmak izini sertifika yönetim konsolundan kopyaladınız. Ve bu kopyalanan değer, Visual Studio'da görünmeyen unicode okunamayan sembol içerir. İlk görünmez sembolü silmeye çalışın ve eğer düşündüğüm buysa, bu işe yaramalı.


2

Ben de aynı şeye rastladım. Bu cevabı burada hiçbir yerde bulamadım, bu yüzden göndereceğim. Görünüşe göre X509Store bulma işlevi düz çalışmıyordu. Bunu basit bir for döngüsü ve sertifikayı manuel olarak alarak doğruladım.

  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

Sertifikanızı mağazada bulmak için kodu aşağıdaki gibi değiştirin:

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

Ayrıca bool iade sertifikaları olan 3. parametre sadece sertifika geçerliyse. Bu yüzden sertifikanızın geçerli olduğundan emin olun. Kendinden imzalı bir sertifikanız varsa, o zaman 3. parametreyi "yanlış" olarak geçmeniz yeterlidir.


Sertifika geçerlidir, çünkü yöntem kodlanmış bir koyma 1 değerini döndürdüğünde var results = store.Certificates.Find (findType, "7a6fa503ab57b81d6318a51ca265e739a51ce660", true); //result.Count = 1 :)
nunofamel

Çalışma zamanında yönteme iletilen parmak izi kimliğinin ne olduğunu kontrol edebilir misiniz?
Rajesh

doğru mu onları Imediate pencerelerine koyuyorum ve o da aynı değere sahip :(
nunofamel

Sözdizimini kodunuzda yukarıda gösterildiği gibi değiştirdiniz mi?
Rajesh

Şimdi İngilizce :) Uygulamamdaki orijinal kod yukarıdaki gibi, sadece bir kopyala + yapıştır
hatasıydı

1

İşte benim için çalışan yukarıdaki öneriler için kodun basit versiyonu

 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

Bu görünmez Unicode karakteriyle de karşılaşıyorum. Not Defteri'ni (Windows 10) kullanmayı denemek benim için de bir şekilde işe yaramadı. Son olarak, temiz parmak izi hex elde etmek için PowerShell kullanıyorum:

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

Unicode char için çok fazla.


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

Sanırım 2. parametrenin "findValue" olduğunu söylüyorsunuz.


the 2nd param really is findValue,
nunofamel

Eğer durum buysa, sorun başka yerdedir. Gerçek içerik farklı olmadıkça (boşluk? Son satırsonu?) Değişmez bir dizeye karşılık bir dize değişken parametresi bu şekilde bölünmeyecektir
Joe

0

Sadece görünmez karakterin ne olduğunu bilmenizi sağlamak için, mmc'deki parmak izinin 75 3a olduğunu görüyorum ...

Sonra onu kopyalayıp vim'ime yapıştırıyorum, şunu görüyorum:

<200e> 75 3a ...

Yani ilk karakter "<200e>" ve fazladan boşluklardan kurtulduktan sonra, sorun olmayacak.


0

Aasmund Eldhuset'in cevabı (ve diğer cevaplar) için +1.

Can sıkıcı bir şekilde, parmak izi metin kutusundaki ilk karakter görünmez Unicode "soldan sağa işaret" kontrol karakteridir.

Mevcut olduğunu doğrulamak zor olabilir. Örneğin, yapılandırma dosyamdan VS ikili düzenleyicisine parmak izini kopyalamak bazen görünmez karakteri alırken bazen almıyor.

Ayrıca bu kod bir problem gösteremedi. Kodun üzerinden geçtim ve istediğim sertifikayı bulmak için fareyi x509Store'a götürdüm.

                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

Uzun analizden sonra, işte benim için işe yarayan şey.

  1. Başparmak baskısını sertifikadan not defterine kopyalayın.
  2. Başparmak baskısını not defterinden görsel stüdyoya kopyalayın.
  3. Visual Studio'yu yönetici olarak çalıştırın.

Bu bir cazibe gibi çalışıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.