У меня проблема при использовании метода 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
), но если я поставлю findValue как константу, метод найдет сертификат.
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();
}
}
источник
Я взял здесь некоторые ответы и объединил их в статический метод, который позаботится об удалении специальных символов и всего верхнего регистра. Надеюсь, кто-нибудь еще сможет им воспользоваться.
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(); } }
источник
У меня была такая же проблема, и я решил ее:
Я скопировал отпечаток пальца из mmc прямо в VS. Я сравнил струны и не нашел никакой разницы.
Проверяя длину с помощью hash.length, было различие: 41 против 40.
К строке добавлен невидимый Char, скопировав его из mmc.
Решение:
Работает.
источник
Это меня тоже сбило с толку, я написал эту функцию для очистки отпечатка пальца при копировании и вставке из 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];
источник
Я стал жертвой этого. В оснастке консоли Windows для отображения отпечатка пальца был не только символ Unicode «слева направо», но и шестнадцатеричные символы нижнего регистра с пробелами между каждыми двумя символами. В выводе CertUtil также были символы нижнего регистра и пробелы. Чтобы найти совпадение, мне пришлось указать findValue как строку, которая была преобразована в
источник
Этот код должен работать.
Я полагаю, вы скопировали этот отпечаток из консоли управления сертификатами. И это скопированное значение содержит нечитаемый символ Юникода, который невидим в Visual Studio. Попробуйте удалить первый невидимый символ, и если это то, о чем я думаю, это должно сработать.
источник
Я столкнулся с тем же самым. Я нигде не нашел здесь этого ответа, поэтому отправлю его. Мне кажется, что функция поиска X509Store просто была плоской и не работала. Я проверил это, выполнив простой цикл for и получив сертификат вручную.
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]; } }
источник
Замените код, чтобы найти сертификат в магазине, как показано ниже:
var results = store.Certificates.Find(findType, findValue, true);
Также третий параметр, который является bool, возвращает сертификаты, только если сертификат действителен. Поэтому убедитесь, что ваш сертификат действителен. Если у вас есть самоподписанный сертификат или около того, просто передайте третий параметр как "false"
источник
Вот простая версия кода для вышеупомянутых предложений - конечно, сработала для меня
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; }
источник
Я также сталкиваюсь с этим невидимым символом Unicode. Попытка использовать Блокнот (Windows 10) тоже как-то не сработала. Наконец, я использую PowerShell, чтобы получить чистый шестнадцатеричный код отпечатка:
PS C:\> $tp= (Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {$_.Subject -match "mycert"}).Thumbprint; PS C:\> $tp
ТАК много для Unicode char.
источник
var results = store.Certificates.Find(findType, findType, true);
Я думаю, вы имеете в виду, что второй параметр - «findValue».
источник
Просто чтобы вы знали, что это за невидимый символ, я вижу отпечаток большого пальца в mmc: 75 3a ...
Затем я копирую и вставляю его в свой vim, я вижу следующее:
<200e> 75 3a ...
Так что после того, как вы избавитесь от первого символа «<200e>» и лишних пробелов, все будет в порядке.
источник
+1 за ответ Осмунда Эльдхусета (и другие ответы).
Может быть трудно проверить его присутствие. Например, при копировании отпечатка из моего файла конфигурации в двоичный редактор VS иногда появляется невидимый символ, а иногда нет.
Также этот код не смог показать проблему. Я прошел через код и наведал указатель мыши на 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);
источник
После долгого анализа у меня сработало вот что.
Это работает как шарм.
источник