Сертификат не найден, если приложение WCF размещено в качестве службы Windows в Windows 7 - PullRequest
0 голосов
/ 08 ноября 2018

У нас есть приложение 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 размещается как консольное приложение в той же среде.

1 Ответ

0 голосов
/ 09 ноября 2018

Причина, по которой не удалось найти сертификат, может заключаться в том, что место нахождения сертификата. Как вы знаете, условие, по которому мы ищем сертификат, - это текущий пользователь, а расположение хранилища сертификатов - МОЙ, текущий пользователь - текущий пользователь для входа в систему.

var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);

Хотя пользователь может быть другим пользователем, который отличается от текущего пользователя при входе в систему, когда мы устанавливаем службу Windows.
enter image description here
Так что нам лучше искать сертификат, который хранится в LocalMachine, и его могут найти любые пользователи.
Кроме того, мы можем использовать команду Certlm.msc для управления сертификатами в LocalMachine.
Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.

...