2010-08-24 6 views
4

Je dois faire une preuve de concept et jusqu'à présent, je trouve principalement des anciens articles qui font référence à IIS6, ce qui n'aide pas.IIS 7.5 et l'authentification du client

En bref, j'ai les exigences suivantes.

Je dois sécuriser un fichier/page et ce fichier/page seulement en utilisant un certificat client. Le reste du site doit continuer à fonctionner sous SSL mais ne nécessite pas de certificat client, juste ce fichier. Le mappage utilisateur est interdit car le mappage sera effectué par programmation via C#/VB.NET. Maintenant, je sais que cela ne devrait pas être difficile. Je veux dire que je devrais avoir accès à la propriété Request.ClientCertificate mais mon problème est que dans mes tests, je ne peux pas obtenir un certificat client pour voyager le long du réseau. J'ai défini IIS sur un dossier (juste pour rendre ma vie simple) exigent SSL et acceptent des certs de client aussi bien qu'exigent des certs de client mais tout que j'obtiens de l'IIS visitant la page est HTTP/1.1 403 Forbidden. Je ne suis jamais invité à choisir un certificat client à envoyer au serveur, il crache tout sur ma demande et le laisse tomber.

Il devient encore plus bizarre quand j'utilise du code pour le tester. Dans ce code client, la classe CertPolicy renvoie juste une méthode pour ignorer les erreurs cert et test.cer est un certificat auto-signé créé à l'aide de MakeCert. Juste pour que ce soit clair, seulement le cert client si auto signé, le cert principal est correctement signé, mais je joue avec fiddler beaucoup et je n'ai pas confiance en ce cert c'est pourquoi j'ai le callback hacky.

Dim Cert As X509Certificate = X509Certificate.CreateFromCertFile("Cert\test.cer") 
' Handle any certificate errors on the certificate from the server. 
ServicePointManager.CertificatePolicy = New CertPolicy() 
' You must change the URL to point to your Web server. 
Dim Request As HttpWebRequest = DirectCast(WebRequest.Create("https://local.domain.com/Cert/Server/"), HttpWebRequest) 
Request.ClientCertificates.Add(Cert) 
Request.UserAgent = "Client Cert Sample" 
Request.Method = "GET" 

Dim sr As StreamReader 
Using Response As HttpWebResponse = DirectCast(Request.GetResponse, HttpWebResponse) 
    ' Print the repsonse headers. 
    output.AppendFormat("{0}\r\n", Response.Headers) 
    output.AppendLine() 
    ' Get the certificate data. 
    sr = New StreamReader(Response.GetResponseStream, Encoding.Default) 
    Dim count As Integer 
    Dim ReadBuf() As Char = New Char((1024) - 1) {} 
    Do 
     count = sr.Read(ReadBuf, 0, 1024) 
     If Not 0 = count Then 
      output.AppendLine(New String(ReadBuf)) 
     End If 
    Loop While (count > 0) 
End Using 

La page cible renvoie simplement le nombre de certs ci-joint, qui retourne toujours si je mets IIS pour accepter ou ignorer certs client mais pas obligatoire la.

Protected Overrides Sub OnLoad(ByVal e As System.EventArgs) 
    MyBase.OnLoad(e) 
    Dim cs As HttpClientCertificate = Request.ClientCertificate 
    Response.Write(cs.Count) 
    Response.End() 
End Sub 

Si quelqu'un peut me aider à trouver comment configurer IIS7.5 pour permettre certs client à joindre à une demande et vient de traverser, ce serait génial.

Répondre

3

Ceci est une vieille question mais je l'ai trouvé en cherchant mes propres réponses et j'ai pensé qu'il fallait y répondre. Dans le web.config pour le site Web, pour activer les certificats clients, vous devez d'abord vous assurer que le module d'authentification est installé, puis activez la fonction:

<location path="yourpath"> 
    <system.webServer> 
    <security> 
     <access sslFlags="Ssl, SslNegotiateCert"/> <!-- or SslRequireCert --> 
     <authentication> 
     <iisClientCertificateMappingAuthentication enabled="true" 
      oneToOneCertificateMappingsEnabled="true"> 
      <!-- or manyToOneCertificateMappingsEnabled="true" --> 
     </iisClientCertificateMappingAuthentication> 
     </authentication> 
    </security> 
    </system.webServer> 
</location> 

Ensuite, vous ajoutez une à une ou many mappages à un à l'intérieur de l'élément iisClientCertificateMappingAuthentication.

+0

Je constate que si vous spécifiez 'SslRequireCert', vous devez * également * spécifier' SslNegotiateCert'. – AakashM

+0

semble que vous êtes sur quelque chose. Pourriez-vous vérifier http://stackoverflow.com/questions/14407666/how-do-i-implement-client-certificate-authentication-the-right-way et peut-être fournir les informations nécessaires que je recherche? Important pour moi lié à cette réponse est l'importance de ce noeud ClientCertificateMappingAuthentication dans le web.config pour la partie serveur de la configuration. –

2

Lorsque le serveur demande le certificat client au navigateur, il envoie une liste des autorités de certification auxquelles il fait confiance. Le navigateur filtre ensuite les certificats disponibles en fonction de ces informations afin d'afficher uniquement les certificats pertinents (ceux émis par les autorités de certification auxquelles le serveur fait confiance) dans la boîte de dialogue de choix de certificat.

(ce qui est au moins comment fonctionne Internet Explorer, je ne sais pas si d'autres navigateurs effectuent un tel filtrage.)

Par conséquent ne doit pas être auto-signé le certificat client, mais 1) devrait être délivré par un certificat autorité, 2) le certificat de cette autorité de certification doit être installé sur le serveur (dans le magasin Autorités de certification racine de confiance du compte d'ordinateur local).

À des fins de test, vous pouvez configurer votre propre autorité de certification, assurez-vous simplement que son certificat est installé sur le serveur.

Questions connexes