Mam problem, kiedy używam tej metody 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();
}
}
W tym przypadku metoda Find zwraca 0 wyników ( results.Count == 0
), ale jeśli ustawię findValue jako stałą, metoda znajdzie certyfikat.
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();
}
}
źródło
Wziąłem tutaj niektóre odpowiedzi i połączyłem je w statyczną metodę, która zajmuje się usuwaniem znaków specjalnych i wielkich liter. Miejmy nadzieję, że ktoś inny może go użyć.
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(); } }
źródło
Miałem ten sam problem i rozwiązałem go:
Skopiowałem odcisk palca z mmc bezpośrednio do VS. Porównałem struny i nie znalazłem żadnej różnicy.
Sprawdzając długość z hash.length, była różnica 41 w porównaniu z 40.
Istnieje niewidoczny znak Char dodawany do ciągu przez skopiowanie go z mmc.
Rozwiązywanie:
To działa.
źródło
To też mnie zaskoczyło, napisałem tę funkcję, aby wyczyścić odcisk palca po skopiowaniu i wklejeniu z MMC:
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];
źródło
Padłem tego ofiarą. Nie tylko znajdował się znak Unicode „od lewej do prawej” na wyświetlaniu odcisku palca w konsoli systemu Windows, ale także zawierał małe litery szesnastkowe ze spacjami między każdymi dwoma znakami. Dane wyjściowe CertUtil zawierały również małe litery i spacje. Aby uzyskać dopasowanie, musiałem określić findValue jako ciąg, który został przekształcony do
źródło
Ten kod powinien działać.
Przypuszczam, że skopiowałeś ten odcisk palca z konsoli zarządzania certyfikatami. A ta skopiowana wartość zawiera nieczytelny symbol Unicode, który jest niewidoczny w programie Visual Studio. Spróbuj usunąć pierwszy niewidoczny symbol i jeśli o tym myślę, to powinno działać.
źródło
Wpadłem na to samo. Nigdzie nie mogłem znaleźć tej odpowiedzi, więc ją opublikuję. Wydaje mi się, że funkcja wyszukiwania X509Store po prostu nie działała. Sprawdziłem to, wykonując prostą pętlę for i ręcznie pobierając certyfikat.
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]; } }
źródło
Zastąp kod, aby znaleźć swój certyfikat w sklepie, jak poniżej:
var results = store.Certificates.Find(findType, findValue, true);
Również trzeci parametr, którym są certyfikaty zwrotu bool tylko wtedy, gdy certyfikat jest ważny. Dlatego upewnij się, że Twój certyfikat jest ważny. Jeśli masz certyfikat z podpisem własnym, po prostu przekaż trzeci parametr, aby był „fałszywy”
źródło
Oto prosta wersja kodu dla powyższych sugestii - oczywiście, która działa dla mnie
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; }
źródło
Napotykam również ten niewidoczny znak Unicode. Próba korzystania z Notatnika (Windows 10) też nie działała dobrze. Na koniec używam PowerShell, aby uzyskać czysty odciski palców:
PS C:\> $tp= (Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {$_.Subject -match "mycert"}).Thumbprint; PS C:\> $tp
Tyle dla znaków Unicode.
źródło
var results = store.Certificates.Find(findType, findType, true);
Myślę, że masz na myśli, że drugim parametrem jest „findValue”.
źródło
Żeby ci powiedzieć, czym jest niewidzialna postać, widzę odcisk kciuka w mmc: 75 3a ...
Następnie kopiuję i wklejam go w swoim vimie, widzę:
<200e> 75 3a ...
Więc po pozbyciu się pierwszego znaku „<200e>” i dodatkowych spacji wszystko będzie dobrze.
źródło
+1 za odpowiedź Aasmunda Eldhuseta (i inne odpowiedzi).
Sprawdzenie, czy jest obecny, może być trudne. Na przykład skopiowanie odcisku palca z mojego pliku konfiguracyjnego do edytora binarnego VS czasami powoduje uzyskanie niewidocznego znaku, a czasami nie.
Również ten kod nie pokazał problemu. Przeszedłem przez kod i najechałem myszką na x509Store, aby znaleźć certyfikat, którego szukałem.
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);
źródło
Po długiej analizie, oto co zadziałało dla mnie.
To działa jak urok.
źródło