Подтвердить что ты не робот

Браузер не запрашивает сертификат клиента

Фон:

Я обновляю внутреннее приложение для двухэтапного процесса аутентификации. Я хочу добавить процесс проверки сертификата клиента (через смарт-карту) поверх традиционной формы имени пользователя/пароля. Приложение написано на С#, размещенном на IIS7, и нацелено на Chrome и IE8.

Проблема:

У меня возникают проблемы с тем, чтобы приложение запрашивало у пользователя сертификат клиента. Я отлаживал приложение с помощью Fiddler. Когда у меня есть сертификат тестового клиента, сохраненный в пользовательском каталоге Fiddler (C:\Documents and Settings\USER\My Documents\Fiddler2), приложение работает как ожидалось. Мне предлагается номер PIN-кода, защищающий смарт-карту, и, когда он правильно введен, возвращает меня в форму для входа. Когда я закрываю Fiddler, приложение вместо этого выдает ошибку 403 Forbidden (поскольку Fiddler больше не работает и указывает на его сертификат). То, что я не смог понять, - это то, почему приложение не запрашивает сертификат обычно.

Текущая настройка сервера:

  • Создан самоподписанный сертификат
  • 443 Связывание указывает на самоподписанный сертификат
  • Анонимная аутентификация включена
  • Сертификат с самостоятельной подпиской был добавлен как к доверенному корневому ЦС, так и к промежуточному ЦС (я прочитал, что другой человек имел это как в доверенном корневом ЦС, так и в том, что решил их проблему, хотя ни одна из них не работала для нас).
  • Я очистил остальные сертификаты в доверенном корневом ЦС, которые мне не нужны (я читал в другом месте, что наличие слишком большого количества сертификатов может привести к блокировке SSL).

У меня нет идей, чтобы попробовать, кроме как начать с нуля на другом сервере. Кто-нибудь знает, в чем проблема? Кажется, это должно быть довольно прямолинейно, и я пропускаю что-то незначительное. Любые идеи приветствуются.

Update:

Проведя больше времени с этой проблемой сегодня, я твердо верю, что это связано с неправильной настройкой IIS7 (я не настроил ее изначально). Я думаю, это потому, что я включил Failed Request Tracing, посмотрел на последующие .xml файлы, которые были сгенерированы, и увидел, что была выбрана ошибка 500.

Chrome бросает сообщение "Доступ к веб-странице отклонен", а не "403 - Запрещено: доступ запрещен". Я не знаю, поможет ли это. Я знаю, что, когда я не сделаю необходимые сертификаты, сайт будет работать по назначению. Требование сертификата - это то, где он терпит неудачу.

Пул приложений установлен в .Net 4.0 | Классический | Сетевая служба.

4b9b3361

Ответ 1

Ваша проблема заключается в том, что браузер не получает запрос на предоставление сертификата клиента или существует связанная с безопасностью возможность блокировать его. IE предлагает сертификат только в том случае, если веб-сайт находится в правильной зоне (интрасети или доверенные сайты). Пожалуйста, проверьте это прежде всего.

Если это не поможет увидеть этот ответ для следующего шага. В документации netsh говорится:

clientcertnegotiation
Optional. Specifies whether the negotiation of certificate is enabled or disabled. Default is disabled.

Включите это, и даже самый тупой браузер должен заметить, что он должен предлагать сертификат для аутентификации. Чтобы дополнительно диагностировать вашу проблему, вы можете использовать WireShark, чтобы увидеть переговоры в действии.

Ответ 2

Попробуйте openssl s_client -connect yourip:443 -prexit И посмотрите, посылает ли CA (ваш подписанный сертификат) клиенту в именах CA CA приемлемого клиента.

вам нужно сначала установить openssl, если у вас его нет.

Ответ 3

В каждом браузере, который я видел, браузер не предложит вам выбрать сертификат, если у него нет сертификатов, подписанных центром сертификации, которому доверяет сервер. Поэтому убедитесь, что ваш сервер настроен с правильными ЦС. Как предложил Boklucius, вы можете использовать openssl для изучения списка доверенных ЦС, которые ваш сервер отправляет клиентам, и посмотреть, есть ли среди них CA, с которым вы подписали сертификаты клиентов.

Ответ 4

Чтобы добавить довольно болезненный урок в микс: убедитесь, что вы покинули Skype (или любое другое приложение), которое ест порт 443.

Итак, идея здесь в том, что вы используете среду dev на одном компьютере (как клиент, так и IIS), и ваша команда использует Skype или другое приложение для общения.

Следите, чтобы часы шли, когда вы пытаетесь отладить эту проблему, казалось бы, делаете все "правильно", netsh http sslcerts и т.д., даже перезагружая, но безрезультатно. Ну, получается, что Skype будет есть 443, поэтому выключите его, и "poof" отправит ваш сертификат.

Тогда не стесняйтесь бросать вещи у стены, кричать непристойности или просто "Ярость, ярость против смерти света".

Ответ 5

Кроме того, убедитесь, что Fiddler не мешает. Если вы расшифруете SSL, это приведет к повреждению сообщения в IE, и у него нет установленного сертификата, поэтому он не может его предложить. Выключите скрипач, и вуаля появится приглашение сертификата.