X509Certificate2.Verify () возвращает true в консольном приложении, false в веб-приложении asp.net

Я чувствую, что это как-то связано с разрешениями AppPool, но поскольку это приложение размещено в Azure, это невозможно изменить.

Мой код работает в консольном приложении, и когда AppPool настроен на запуск от имени пользователя (я). Он не запускается, когда AppPool настроен на запуск как ApplicationIdentity и когда служба размещена в Azure (я отправлю код, если потребуется, но я не думаю, что проблема заключается в этом).

Неважно, загружаю ли я сертификат из магазина, из файла или из массива байтов. Результаты такие же.

Я не знаю, какая информация будет полезна при диагностике этого, но похоже, что цепочка / путь не загружается с ограниченными привилегиями. Вызов .Verify () возвращает true в консольном приложении (и IIS, работающем от имени моего пользователя) и false в ApplicationIdentity.

Сертификат загружается нормально и в обоих случаях содержит закрытый ключ.


person Matthew Steeples    schedule 09.11.2011    source источник


Ответы (2)


Оказывается, моя проблема была та же, что и в этом вопросе. Мне нужно было настроить свои сертификаты так, чтобы некоторые из них находились в разделе CA и Trust, чтобы цепочка была построена правильно.

У меня были установлены все сертификаты, но, похоже, расположение сертификата также важно, и это не имело никакого отношения к безопасности или к тому, какой пользователь вообще вошел в систему!

person Matthew Steeples    schedule 10.11.2011

В Azure можно изменить практически все. По умолчанию это полный IIS (если вы не обновляетесь с SDK 1.3 или более ранней версии). Есть несколько вариантов:

  1. (Это неверно! Замечено Стивом Марксом) Попробуйте запустить приложение (в данном случае IIS AppPool) в режиме с расширенными правами. Это заставит AppPool работать под учетной записью «SYSTEM» вместо AppPoolIdentity. Вы можете сделать это, добавив ‹runtime executionContext =" повышенный "/› в определении вашей роли в файле .CSDEF.

  2. Вы можете включить удаленный рабочий стол для всех своих ролей. Это эффективно создаст учетную запись в вашем экземпляре роли и добавит ее в группу администраторов. Затем вы можете использовать задачу запуска и сценарий PowerShell, чтобы изменить идентификатор AppPool, чтобы вместо этого использовать эту учетную запись: Сообщение в блоге Уэйда Вегнера о том, как программно изменить идентификацию пула приложений.

Что ж, все это способы заставить ваш пул приложений работать в режиме с повышенными правами, но также показывают, что вы можете делать практически все с помощью IIS на своем экземпляре Windows Azure. Я предлагаю использовать запуск сайта в повышенном режиме только в целях тестирования. Сначала запустите свой код в ограниченной учетной записи на локальном IIS. Затем посмотрите, что вы изменили, чтобы заставить его работать локально, и примените эти изменения к веб-роли Azure.

ИЗМЕНИТЬ

Также следует обратить внимание на то, что для работы .Verify () необходимо наличие корневого сертификата центра сертификации, выдавшего проверенный сертификат, установленного в веб-роли. Это можно сделать, добавив сертификат корневого центра сертификации в качестве «сертификата службы» с портала управления. Также должен доверять центр сертификации, выдавший проверенный сертификат.

person astaykov    schedule 09.11.2011
comment
№1 неверен. Запуск веб-роли с повышенными правами не влияет на удостоверение, используемое для пула приложений. (IIS по-прежнему будет использовать сетевую службу.) Он изменяет только идентификатор, используемый для запуска кода RoleEntryPoint. - person user94559; 09.11.2011
comment
Я думаю, что наиболее вероятная проблема заключается в том, что цепочка доверия сертификата нарушена, как вы упомянули. На вашем локальном компьютере откройте сертификат в диспетчере сертификатов и проверьте вкладку «Путь к сертификату», он покажет что-то над сертификатом. RDP в лазурную машину и проверьте то же самое, вероятно, у него будет отсутствовать CA или его вариант. - person knightpfhor; 09.11.2011