2010-03-25 6 views
15

J'essaie de configurer un site Web IIS pour exiger des certificats de client SSL. Le site Web est configuré à la fois dans IIS 6 et 7, bien que je sois plus intéressé à le faire fonctionner pour 7. J'ai défini la propriété require client certificates dans IIS et fonctionne très bien lors de l'accès au site via un navigateur Web. client basé a du mal à y accéder.Demande à IIS de demander un certificat client SSL lors de la négociation initiale

Je crois que le problème est que IIS ne demande pas de certificat client lors de la prise de contact SSL initiale. Au lieu de cela, il négocie une connexion SSL normale, vérifie si la ressource nécessite des certificats clients et, si c'est le cas, initie une nouvelle négociation SSL qui demande un certificat client. IIS prend en charge les sites qui ne requièrent que les certificats clients pour certaines ressources. Même lorsque l'exigence est spécifiée pour l'ensemble du site Web, IIS initie toujours deux liaisons SSL. Je veux forcer IIS à demander le certificat client lors de la première prise de contact SSL, ce qui devrait, espérons-le, faire fonctionner les choses pour le client. (Le client est développé par un partenaire externe et je n'ai pratiquement aucune connaissance de la façon dont il est configuré et aucun accès à son code source)

Est-ce que quelqu'un a déjà traité ce problème dans IIS?

+0

Vous pouvez essayer cette question sur serverfault.com – Jeff

Répondre

6

Il m'a fallu un certain temps pour trouver ce paramètre de métabase. Nous avions ce même problème avec notre client en utilisant les nouvelles bibliothèques certicom. Depuis la découverte de l'attaque MITM autour de la renégociation SSL, la réponse dans beaucoup de cercles a été de raccrocher sur les demandes de renégociation. L'exécution de la cmd suivante à partir de \ inetpub \ adminscripts force IIS à toujours demander un certificat client.

Pour IIS 6: cscript adsutil.vbs set \ W3SVC \ numéro du site \ SSLAlwaysNegoClientCert vrai

(Donc, pour le site par défaut, cscript adsutil.vbs set \ W3SVC \ 1 \ SSLAlwaysNegoClientCert True)

Conserver en gardant à l'esprit que certains clients Internet Explorer demandent des certificats clients lorsqu'ils reçoivent ce paquet si le certificat client est nécessaire ou non.

Pour IIS 7:

Enregistrez le texte suivant dans un fichier appelé "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); 

Exécutez la commande suivante à partir d'une commande élevée/administrateur invite:

cscript. exe enable_ssl_renegotiate_workaround.js

(extrait de l'article de la BC pour 977377)

+1

bien, il na pas comme la façon dont je dactylographié ... générique cscript adsutil.vbs \ W3SVC \ numéro du site \ SSLAlwaysNegoClientCert vrai pour le site Web par défaut (exemple) cscript adsutil.vbs \ w3svc \ 1 \ SSLAlwaysNegoClientCert True –

+0

Est-ce que cela fonctionne dans IIS 7? Je me souviens de trouver SSLAlwaysNegoClientCert mais je ne pouvais pas trouver comment le définir dans IIS 7. J'ai trouvé cette explication récemment: http://forums.iis.net/t/1158990.aspx. En fin de compte, nous avons décidé d'emprunter une voie différente pour l'authentification de nos clients. Mon intérêt ne vient donc que de la curiosité. Merci pour votre réponse. – nslowes

+0

Oui, notre doc d'installation recommande déjà les composants de compatibilité IIS 6. Donc, je suis parti facile. Votre question aurait pu me sauver un chewing-gum le lundi si. Je n'ai pas vérifié si adsutil faisait partie des composants de la combativité IIS 6. J'en ai eu beaucoup trop pour m'en préoccuper maintenant. –

8

Voilà comment je l'ai fait, sur IIS 7.5:

  1. Exécutez la commande suivante dans une invite de commande admin: netsh http show sslcert
  2. Enregistrer la sortie dans un fichier texte.Ressemble à quelque chose comme ceci:

    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. Créer un fichier de commandes en utilisant cette information:

    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 
    

    (Oui, vous devez supprimer et ajouter de nouveau, vous ne pouvez pas modifier simplement in- de clientcertnegotiation C'est pourquoi il est important de sauvegarder le hash et GUID, donc il sait quoi rajouter.)

  4. Exécutez ce fichier de commandes, vérifiez les erreurs, terminé.

Gardez à l'esprit que ce paramètre est appliqué par certificat, non par serveur. Donc, si vous utilisez plusieurs certificats, ou modifiez/mettez à jour votre certificat, vous devrez le faire à nouveau.

+0

Il doit y avoir des sauts de ligne entre chacune de ces commandes netsh. Je ne me souviens pas d'où je suis arrivé - KB? MSDN? – CrazyPyro

+0

Deuxièmement, cela fonctionne dans IIS 7.5 sur Windows 2008 R2. –

Questions connexes