2010-03-25 22 views
15

Estoy intentando configurar un sitio web de IIS para que requiera certificados de cliente SSL. El sitio web está configurado en IIS 6 y 7, aunque estoy más interesado en hacerlo funcionar para 7. Configuré la propiedad de requerir certificados de cliente en IIS y funciona bien cuando accedo al sitio a través de un navegador web, pero un Java- cliente basado tiene problemas para acceder a él.Hacer que IIS requiera un certificado de cliente SSL durante la toma de contacto inicial

Creo que el problema es que IIS no solicita un certificado de cliente durante el inicio de sesión inicial de SSL. En su lugar, negocia una conexión SSL normal, comprueba si el recurso requiere certificados de cliente y, si lo hace, inicia un nuevo protocolo de enlace SSL que solicita un certificado de cliente. IIS lo hace para admitir sitios que solo requieren los certificados del cliente para ciertos recursos. Incluso cuando se especifica el requisito para todo el sitio web, IIS aún inicia dos apretones de manos SSL. Quiero obligar a IIS a solicitar el certificado del cliente en el primer protocolo de enlace SSL, que con suerte hará que las cosas funcionen para el cliente. (El cliente está desarrollado por un socio externo y prácticamente no tengo conocimiento de cómo está configurado y no tiene acceso a su código fuente)

¿Alguien ha enfrentado este problema en IIS anteriormente?

+0

Es posible que desee para tratar esta cuestión en serverfault.com – Jeff

Respuesta

6

Me tomó un tiempo encontrar esta configuración de metabase. Estábamos teniendo el mismo problema con nuestro cliente al usar las nuevas bibliotecas certicom. Desde el descubrimiento del ataque de MITM alrededor de la renegociación de SSL, la respuesta en muchos círculos ha sido suspender las solicitudes de renegociación.

ejecutando el siguiente cmd desde \ inetpub \ adminscripts obligará a IIS a solicitar siempre un certificado de cliente.

Para IIS 6: cscript adsutil.vbs set \ w3svc \ siteID \ SSLAlwaysNegoClientCert verdadera

(tanto para el sitio web predeterminado, cscript adsutil.vbs set \ w3svc \ 1 \ SSLAlwaysNegoClientCert Verdadero)

Keep en cuenta que algunos clientes Internet Explorer solicitan certificados de cliente cuando recibe ese paquete si el certificado del cliente es necesario o no.

Para IIS 7:

Guardar el siguiente texto en un archivo llamado "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); 

ejecute el siguiente comando desde un símbolo del sistema elevado/administrador:

cscript. exe enable_ssl_renegotiate_workaround.js

(Extraído del artículo de KB para 977377)

+1

así, se dio como la forma en que he escrito que ... genérica cscript adsutil.vbs \ w3svc \ siteID \ SSLAlwaysNegoClientCert verdadera para el sitio web por defecto (Ejemplo) cscript adsutil.vbs \ w3svc \ 1 \ SSLAlwaysNegoClientCert True –

+0

¿Funciona esto en IIS 7? Recuerdo encontrar SSLAlwaysNegoClientCert, pero no pude averiguar cómo configurarlo en IIS 7. Encontré esta explicación recientemente: http://forums.iis.net/t/1158990.aspx. Al final, decidimos tomar una ruta diferente para la autenticación de nuestros clientes, por lo que mi interés es solo por curiosidad. Gracias por tu respuesta. – nslowes

+0

Sí, nuestro documento de configuración ya recomienda los componentes de compatibilidad de IIS 6. Entonces, me bajé fácil. Sin embargo, su pregunta me pudo haber ahorrado un vagabundo masticando el lunes. No verifiqué si adsutil formaba parte de los componentes de combatibilidad de IIS 6. He tenido demasiados demasiados para preocuparme por eso ahora. –

8

Así es como lo hice, en IIS 7.5:

  1. ejecute el siguiente en un símbolo del sistema de administrador: netsh http show sslcert
  2. guardar la salida en un archivo de texto.Se verá algo como esto:

    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. Crear un archivo por lotes utilizando esa información:

    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 
    

    (Sí, usted tiene que eliminar y volver a añadir, que no sólo puede alterar in- clientcertnegotiation lugar. Es por eso que es importante guardar el hash y GUID, por lo que sabe qué volver a agregar.)

  4. Ejecutar ese archivo por lotes, comprobar si hay algún error, hecho.

Tenga en cuenta que este ajuste se aplica por certificado, no por servidor. Entonces, si usa múltiples certs, o cambia/actualiza su cert, tendrá que hacer esto nuevamente.

+0

Debe haber nuevas líneas entre cada uno de esos comandos netsh. No recuerdo de dónde saqué esto de KB? MSDN? – CrazyPyro

+0

En segundo lugar, esto funciona en IIS 7.5 en Windows 2008 R2. –

Cuestiones relacionadas