Сертификат, хранящийся в хранилище сертификатов, со временем исчезает из приложения ASP.NET - PullRequest
0 голосов
/ 18 августа 2011

У меня есть сертификат подписи кода от Thawte, который я использую для динамического создания и подписания манифестов развертывания ClickOnce. Проблема в том, что приложение ASP.NET, которое генерирует и подписывает эти манифесты, работает нормально, когда мы перезапускаем IIS или повторно импортируем сертификат подписи, но со временем следующая функция не может найти сертификат:

private static X509Certificate2 GetSigningCertificate(string thumbprint)
{
    X509Store x509Store = new X509Store(StoreLocation.CurrentUser);
    try
    {
        x509Store.Open(OpenFlags.ReadOnly);
        X509Certificate2Collection x509Certificate2Collection = x509Store.Certificates.Find(
            X509FindType.FindByThumbprint, thumbprint, false);

        if (x509Certificate2Collection.Count == 0)
            throw new ApplicationException(
                "SigningThumbprint returned 0 results.  Does the code signing certificate exist in the personal store?",
                null);

        if (x509Certificate2Collection.Count > 1)
            throw new ApplicationException(
                "SigningThumbprint returned more than 1 result.  This isn't possible", null);

        var retval = x509Certificate2Collection[0];

        if(retval.PrivateKey.GetType() != typeof(RSACryptoServiceProvider))
            throw new ApplicationException("Only RSA certificates are allowed for code signing");

        return retval;
    }
    finally
    {
        x509Store.Close();
    }
}

В конце концов приложение начинает выдавать ошибки, которые не могут найти сертификат. Я озадачен, потому что я думаю, что сертификат установлен правильно (или, в основном, правильно), потому что он находит сертификат, когда мы запускаем приложение ASP.NET, но в какой-то момент мы попадаем в ветвь Count == 0, и это просто неверно сертификат находится в хранилище сертификатов пользователя "Текущий пользователь \ Личный" в пуле приложений.

Вопрос: Почему сертификат может внезапно «исчезнуть» или не быть найденным?

1 Ответ

1 голос
/ 19 августа 2011

Разобрался сам (мучительно).

Сертификат необходимо установить в хранилище LocalMachine и разрешить чтение учетной записи пула приложений для сертификата с помощью WinHttpCertCfg или CACLS.exe, если он будет использоваться из приложения ASP.NET. Использование хранилища CurrentUser учетной записи, на которой запущен пул приложений, вызывало проблему. Я предполагаю, что есть какое-то состояние гонки или что-то не очень крутое в доступе к хранилищу CurrentUser от пользователя, который не работает в сеансе интерактивного входа.

Сначала нам не удалось сделать это, потому что мы вызывали инструмент MAGE для создания / подписания манифеста развертывания ClickOnce, и для этого требуется, чтобы сертификат подписи кода находился в CurrentUser \ My store. Тем не менее, мы устранили необходимость в MAGE, а) создавая манифест из файла шаблона и заменяя значения, которые нам необходимо заменить, и б) подписывая манифест, вызывая вызовы кода MAGE посредством отражения, которое существует в BuildTasks. v3.5 DLL. В результате мы имеем больший контроль над тем, какой сертификат мы используем для подписания манифеста, и можем разместить его там, где мы хотим. В противном случае мы бы застряли, если бы мы не пошли немного «на более низкий уровень».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...