Ответ 1
Я исправил эту проблему, введя серийный номер вместо копирования из окна свойств. Я не знаю, почему при копировании из этого окна он содержит странный символ в начале серийного номера.
Я импортировал свои сертификаты в Личные → Сертификаты.
Я использую следующие строки кода, чтобы найти свой сертификат по серийному номеру, но не могу:
public X509Certificate2Collection FindCerts(string serialNumber)
{
var searchType = X509FindType.FindBySerialNumber;
var storeName = "MY";
var certificatesStore = new X509Store(storeName, StoreLocation.LocalMachine);
certificatesStore.Open(OpenFlags.OpenExistingOnly);
var matchingCertificates = certificatesStore.Certificates.Find(searchType, serialNumber, true);
certificatesStore.Close();
return matchingCertificates;
}
Не могли бы вы рассказать мне, почему я не могу найти свой сертификат, даже если он находится в списке сертификатовStore.Certificates?
Примечание: мои сертификаты были созданы Go Daddy
Я исправил эту проблему, введя серийный номер вместо копирования из окна свойств. Я не знаю, почему при копировании из этого окна он содержит странный символ в начале серийного номера.
Так как я наткнулся на эту проблему, я попытался сделать обходной путь, чтобы иметь возможность скопировать вставку значения из certmgr.msc
Резюме того, что я сделал:
// The value below is pasted from certmgr.msc
var sslCertificateSerialNumber="47 9f da c4 ad d7 33 a6 4c ad 54 d3 d9 95 67 1c";
// Remove all non allowed characters that entered the value while copy/paste
var rgx = new Regex("[^a-fA-F0-9]");
var serial = rgx.Replace(sslCertificateSerialNumber, string.Empty).ToUpper();
Теперь я нашел правильный сертификат с копией/вставленным значением.
Если вы уверены в наличии сертификата в хранилище машин, можете ли вы попробовать указать третий параметр Find() как "false"?
Серийный номер сертификата представляет собой двоичную последовательность данных, которая обозначает большой int неограниченной длины. Если вы где-то видели текст, это может означать, что либо текст был записан как последовательный ИЛИ (что более вероятно), что вы видите двоичный последовательный код Base64 или Base16. В последнем случае вы не найдете его прямолинейным способом - вам нужно декодировать сериал и попробовать это.
Если то, что вы пытаетесь извлечь, это сертификат/выдается GoDaddy, вы можете использовать это:
var certificateStore= new X509Store(StoreLocation.LocalMachine);
certificateStore.Open(OpenFlags.ReadOnly);
var certificates = certificateStore.Certificates;
foreach (var certificate in certificateStore)
{
if (certificate.Issuer.Contains("GoDaddy"))
{
Убедитесь, что serialNumber - это строчная строка. У меня возникли проблемы с поиском сертификатов, когда sn был в нижнем регистре. Также удалите пробелы, если вы скопируете sn из окна сведений о сертификате
Если вы скопируете из окна свойств сертификата Windows, вы можете случайно скопировать некоторые дополнительные невидимые символы, что приведет к нарушению поиска серийного номера.
См. этот вопрос для получения дополнительной информации: Магазин X509 не может найти сертификат по SerialNumber
Вчера я столкнулся с подобной проблемой и провел несколько часов, пытаясь выяснить, почему на самом деле существующий сертификат не найден. Кажется, что метод Certificates.Find выполняет поиск с учетом регистра. Я использовал рекурсивный подход, используя String.Compare.
X509Certificate2 storedCert = null;
for (int i = 0; i < store.Certificates.Count; i++)
{
if (String.Compare(store.Certificates[i].SerialNumber, MySerialNum, true) == 0)
{
storedCert = store.Certificates[i];
break;
}
}
Чтобы найти серийный номер, начиная с серийного номера, как сообщается с помощью оснастки mmc, удалите все пробелы и заглавные буквы всех альфа. Работал для меня. Это даст вам что-то вроде...
008CC59B72BE954F93F1435F6B86227600