Сделать IIS требовать сертификат клиента SSL во время первоначального рукопожатия - PullRequest
19 голосов
/ 25 марта 2010

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

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

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

Ответы [ 2 ]

10 голосов
/ 15 августа 2013

Вот как я это сделал на 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
    

    (Да, вам нужно удалить и повторно добавить; вы не можете просто изменить клиентское согласование на месте. Вот почему важно сохранить хеш и GUID, чтобы он знал, что нужно добавить.)

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

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

7 голосов
/ 09 июля 2010

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

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

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

(То есть для веб-сайта по умолчанию cscript adsutil.vbs установить \ w3svc \ 1 \ SSLAlwaysNegoClientCert True) * 100*

Имейте в виду, что некоторые клиенты 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

(измученный из статьи базы знаний за 977377)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...