Сделайте так, чтобы IIS требовал сертификата клиента SSL во время начального рукопожатия

Я пытаюсь настроить веб-сайт IIS, чтобы требовать сертификаты клиента SSL. Веб-сайт настроен как на IIS 6, так и на 7, хотя я больше заинтересован в том, чтобы он работал на 7. Я установил в IIS свойство требовать клиентские сертификаты, и он отлично работает при доступе к сайту через веб-браузер, но Java основанный клиент имеет проблемы с доступом к нему.

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

Кто-нибудь имел дело с этой проблемой в IIS раньше?

2 ответа

Решение

Мне потребовалось некоторое время, чтобы найти эту настройку метабазы. У нас была такая же проблема с нашим клиентом, использующим новые библиотеки certicom. С момента обнаружения атаки MITM вокруг SSL Renegotiation, ответом во многих кругах было зависание на запросах повторного связывания.

выполнение следующего cmd из \inetpub\adminscripts заставит IIS всегда запрашивать сертификат клиента.

Для IIS 6: cscript adsutil.vbs установите \ w3svc \ siteID \ SSLAlwaysNegoClientCert True

(Таким образом, для веб-сайта по умолчанию cscript adsutil.vbs устанавливает \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)

Вот как я это сделал на IIS 7.5:

  1. Запустите следующее в командной строке администратора: netsh http show sslcert
  2. Сохраните вывод в текстовом файле. Будет выглядеть примерно так:

    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
    
  3. Создайте командный файл, используя эту информацию:

    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, чтобы он знал, что нужно добавить заново.)

  4. Запустите этот пакетный файл, проверьте на наличие ошибок, готово.

Помните, что этот параметр применяется для каждого сертификата, а не для каждого сервера. Поэтому, если вы используете несколько сертификатов или измените / обновите свой сертификат, вам придется сделать это снова.

Другие вопросы по тегам