2015-06-16 1 views
2

У меня есть проблема, когда я использую store.Certificates.Find. Я использую Windows Server 2008 R2 с NET 3.5. Сертификат устанавливается поX509Store Certificates.Find FindByThumbprint

public static void AddCertificate(X509Certificate2 cert, StoreName name = StoreName.My, StoreLocation location = StoreLocation.LocalMachine) 
    { 
     var store = new X509Store(name, location); 
     store.Open(OpenFlags.ReadWrite); 
     store.Add(cert); 
     store.Close(); 
    } 

После этого найти сертификат на

string certThumbprint = "XXXX"; 
var certificates = store.Certificates.Find(X509FindType.FindByThumbprint, commandLineArgs.CertificateThumbprint, true); 

if (certificates.Count == 0) 
    { 
    throw new ArgumentException("No certificate found with given thumbprint."); 
    } 

исключения не должны быть брошены на всех, но это, кажется, брошена иногда. Он выдает исключения примерно 5 раз на 100 прогонов.

У меня есть googled и найден проблема «невидимого первого символа», но в моем случае отпечаток действительно жестко закодирован. Я нигде не читаю отпечаток. Точные коды, запущенные на сервере Windows 2012 с NET.4.5, никогда не задавали мне никаких проблем. Это относится только к серверу Windows с NET.3.5. Мне интересно, почему результаты настолько непоследовательны только на WS2008R2?

ответ

0

Я думаю, что эта проблема может быть, что ваш пользователь не имеет permisions сертификата

Попробуйте

  1. Скачать и установить: Windows HTTP Services Certificate Configuration Tool (WinHttpCertCfg.exe) http://www.microsoft.com/en-us/download/details.aspx?id=19801
  2. И запустите: WinHttpCertCfg.exe -g -c LOCAL_MACHINE \ Store, -s "IssuedToName" -a "AccountName"
0

Убедитесь, что сертификат действительно находится в LocalMachine \ My store, где вы его вставили. Я предполагаю, что вы найдете сертификат в магазине, но когда вы дважды щелкните его, вы увидите, что ему не доверяют. Мое предположение заключается в том, что цепочка сертификатов не была создана до доверенного корневого ЦС.

Теперь измените код для поиска сертификата (я изменил последний параметр, чтобы ложные)

var certificates = store.Certificates.Find(X509FindType.FindByThumbprint, commandLineArgs.CertificateThumbprint, false); 

или (ИМХО лучше) сделать импортный сертификат доверенного путем импорта сертификатов ЦС в соответствующих магазинах (Коренные, Промежуточные органы).