У нас есть приложение WCF, которое может быть размещено как в качестве службы Windows, так и в виде консольного приложения.
Это приложение использует сертификат смарт-карты для проверки подлинности некоторых запросов к стороннему приложению. Мы используем следующую логику для получения сертификата из хранилища сертификатов Windows:
public X509Certificate2 GetCertificate(string certificateName)
{
var store = new X509Store(StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection sel = store.Certificates.Find(X509FindType.FindBySubjectName, certificateName, false);
if (sel.Count == 0)
throw new Exception($"No certificate found with name: {certificateName}");
X509Certificate2 cert = sel.OfType<X509Certificate2>().OrderByDescending(pX => pX.NotAfter).First();
store.Close();
return cert;
}
Этот код хорошо работает в Windows 10, поэтому мы размещаем WCF в качестве службы Windows в нашей производственной среде, когда у клиента доступна Windows 10.
Но в Windows 7 сертификат не найден, когда приложение WCF размещено в качестве службы Windows . Из-за этого мы работаем, размещая приложение WCF как консольное приложение. Нам нужно выяснить, почему он не работает в качестве службы Windows в Windows 7, хотя он находит сертификат, если приложение WCF размещается как консольное приложение в той же среде.