2015-10-07 1 views
2

В моем приложении ASP.NET я загружаю сертификат из хранилища сертификатов:сертификат закрытого ключа бросает CryptographicException под IIS Web Server

var myCert = CertificateUtils.GetCertificate("thumbprint"); 

Этот сертификат содержит пару ключей, который используется для расшифровки зашифрованного приложения настройки.

Сертификат установлен в Персональный магазин сертификатов под номером Локальный компьютер. Он работает хорошо, когда приложение работает под кодом IIS Express. Но если я его выполнил под номером Веб-сервер IIS, то myCert экземпляр отсутствует личный ключ.

PrivateKey поле myCert объекта содержит исключение:

'myCert.PrivateKey' threw an exception of type 'System.Security.Cryptography.CryptographicException' 

Я проверил, что другие поля myCert объекта содержат одни и те же значения (как, например, серийный номер сертификата, отпечатком или истечения срока действия), так это то, кажется, что он получает тот же сертификат под обоими IIS и IIS Express. Только закрытый ключ отсутствует в случае полного IIS.

Единственное, что я изменил, это Local Development Server в свойствах проекта («Использовать IIE Express»/«Использовать веб-сервер IIS»). Он работает внутри Azure Emulator Express в обоих случаях.

У кого-нибудь есть идея, почему это происходит?

ответ

5

Выполнение на IIS Express программы использует ваши учетные данные для доступа к сертификату, в то время как в IIS используются учетные данные идентификатора пула. Вы можете легко проверить ACL сертификата, чтобы узнать, кто разрешен или нет.

Выполните следующие действия:

  1. Проверьте, что пул приложений ваш веб-сайт использует

    Открыть Internet Information Services Manager выберите Сайты в Connections дерево слева , Выберите свой сайт в средней панели и нажмите Основные настройки под Действия на правой панели.

  2. Проверьте, что тождественное пул приложений использует

    Выберите Пулы приложений в Connections дерево слева и найдите идентификатор в средней панели. Вероятно, это будет «NETWORK SERVICE».

  3. разрешения Добавить чтение для идентичности, используемого пула приложений для вашего сертификата

    Откройте Microsoft Management Console (mmc), добавьте Сертификаты оснастки для учетной записи локального компьютера и найти свой сертификат под Личные сертификаты. Откройте его контекстное меню, Все задачи и Управление частными ключами .... Нажмите Добавить .., введите идентификатор («NETWORK SERVICE») и нажмите Проверить имена и OK. Под Разрешения для Разрешить только Прочитать.

    Вы можете прочитать подробности в этом вопросе: How to give ASP.NET access to a private key in a certificate in the certificate store?

+0

Я вижу. Это имеет смысл. Но что я могу сделать, чтобы использовать этот сертификат и ключи под полным IIS, пожалуйста? –

+1

@DawidFerenczy вы можете предоставить идентификатор пула для доступа к сертификату. Это очень легко сделать в управлении сертификатами mmc. –

+0

ОК, поэтому я определил пул приложений, используемый для моего приложения. Идентичность этого пула приложений установлена ​​в «NetworkService», поэтому мне нужно предоставить доступ к сертификату для этой учетной записи, верно? Я проверил сертификаты в MMC, но мне не удалось найти, где настроены разрешения. Не могли бы вы мне помочь, пожалуйста? И какое разрешение мне нужно? –

0

У меня была эта проблема для отладки приложения «.PrivateKey„бросил исключение типа“System.Security.Cryptography.CryptographicException» Решаю например:

В mmc> Локальный компьютер> Персональный> Сертификат> щелкните правой кнопкой мыши по сертификату> Все задачи> Управление закрытыми ключами: Добавьте пользователя «каждый» и выберите «Полный контроль».

+0

Это решение не работает в моем сценарии .. Я уже установил максимальное разрешение для почти IUSRS, Everyone, IUSR ... но все же такое же исключение из «store.storehandle» выбрал исключение типа system.security.cryptography.cryptographicexception »уволен. Любой совет ... высоко ценится. – Amruta