Внесите IIS сертификат сертификата SSL во время первоначального рукопожатия
Я пытаюсь настроить веб-сайт IIS на использование сертификатов SSL-клиентов. Веб-сайт настроен как на IIS 6, так и на 7, хотя меня больше интересует его работа на 7. Я устанавливаю свойство требований клиентских сертификатов в IIS, и он отлично работает при доступе к сайту через веб-браузер, но Java- клиент имеет проблемы с доступом к нему.
Я считаю, что проблема заключается в том, что IIS не запрашивает сертификат клиента во время первоначального подтверждения SSL. Вместо этого он согласовывает обычное SSL-соединение, проверяет, требует ли ресурс клиентских сертификатов, и если он это делает, он инициирует новое квитирование SSL, которое запрашивает сертификат клиента. IIS делает это так, чтобы поддерживать сайты, для которых требуются только клиентские сертификаты для определенных ресурсов. Даже когда требование указано для всего веб-сайта, IIS по-прежнему инициирует два SSL-подтверждения. Я хочу заставить IIS запросить сертификат клиента в первом SSL-квитировании, который, мы надеемся, заставит все работать на клиента. (Клиент разработан внешним партнером, и я практически не знаю, как он настроен и не имеет доступа к его исходному коду)
Кто-нибудь раньше рассматривал эту проблему в IIS?
Ответы
Ответ 1
Мне потребовалось некоторое время, чтобы найти эту настройку метабазы. У нас была такая же проблема с нашим клиентом, используя новые библиотеки certicom. Поскольку обнаружение атаки MITM arround SSL Renegotiation, ответ во многих кругах был причиной зависания при запросах на повторную рекламу.
запуск следующего cmd из \inetpub\adminscripts заставит IIS всегда запрашивать сертификат клиента.
Для IIS 6:
cscript adsutil.vbs set\w3svc\siteID\SSLAlwaysNegoClientCert True
(Итак, для сайта по умолчанию, cscript adsutil.vbs set\w3svc\1\SSLAlwaysNegoClientCert True)
Имейте в виду, что некоторые клиенты Internet Explorer запрашивают клиентские сертификаты, когда он получает этот пакет, если требуется сертификат клиента.
Для IIS 7:
Сохраните следующий текст в файле с именем "Enable_SSL_Renegotiate_Workaround.js"
var vdirObj=GetObject("IIS://localhost/W3svc/1");
// replace 1 on this line with the number of the web site you wish to configure
WScript.Echo("Value of SSLAlwaysNegoClientCert Before: " + vdirObj.SSLAlwaysNegoClientCert);
vdirObj.Put("SSLAlwaysNegoClientCert", true);
vdirObj.SetInfo();
WScript.Echo("Value of SSLAlwaysNegoClientCert After: " + vdirObj.SSLAlwaysNegoClientCert);
Выполните следующую команду из командной строки с повышенными правами/администратором:
cscript.exe enable_ssl_renegotiate_workaround.js
(Размещенный из статьи KB для 977377)
Ответ 2
Вот как я это сделал, на IIS 7.5:
- Выполните следующее в командной строке администратора:
netsh http show sslcert
-
Сохраните вывод в текстовом файле. Будет выглядеть примерно так:
IP:port : 0.0.0.0:443
Certificate Hash : [a hash value]
Application ID : {[a GUID]}
Certificate Store Name : MY
Verify Client Certificate Revocation : Enabled
Verify Revocation Using Cached Client Certificate Only : Disabled
Usage Check : Enabled
Revocation Freshness Time : 0
URL Retrieval Timeout : 0
Ctl Identifier : (null)
Ctl Store Name : (null)
DS Mapper Usage : Disabled
Negotiate Client Certificate : Disabled
-
Создайте пакетный файл, используя эту информацию:
netsh http show sslcert
netsh http delete sslcert ipport=0.0.0.0:443
netsh http add sslcert ipport=0.0.0.0:443 certhash=[your cert hash from above] appid={[your GUID from above]} certstorename=MY verifyclientcertrevocation=enable VerifyRevocationWithCachedClientCertOnly=disable UsageCheck=Enable clientcertnegotiation=enable
netsh http show sslcert
(Да, вы должны удалить и повторно добавить, вы не можете просто изменить clientcertnegotiation на месте. Поэтому важно сохранить хэш и GUID, чтобы он знал, что добавить.)
-
Запустите этот командный файл, проверьте наличие ошибок.
Имейте в виду, что этот параметр применяется для каждого сертификата, а не для каждого сервера. Поэтому, если вы используете несколько сертификатов или меняете/обновляете свой сертификат, вам нужно будет сделать это снова.