Configurer IIS pour exiger un certificate client et utiliser une authentification anonyme

Configurer IIS pour exiger un certificate client et utiliser une authentification anonyme

J'ai un service Web WCF à utiliser pour nos clients. Je veux protéger cela en utilisant des certificates de client. J'utiliserai également le certificate client pour identifier le client.

J'ai fait fonctionner la partie d'identification, mais je ne peux pas faire en sorte que les IIS requièrent des certificates de clients.

Si je configure IIS pour accepter les certificates clients, la communication fonctionne et je peux get l'identité du client en utilisant:

ServiceSecurityContext.Current.PrimaryIdentity.Name 

Mais je peux également accéder au site sans un certificate client. Je ne sais pas si ceux qui ne peuvent pas faire autre chose que de lire le WSDL, mais je ne veux pas que quelqu'un sans certificate de confiance puisse get des informations.

Si j'ai configuré IIS pour exiger un certificate de client, mon client de test qui devrait avoir access obtient l'erreur:

La requête HTTP était interdite avec le système d'authentification client 'Anonymous'.

Je souhaite autoriser l'access uniquement à ceux qui ont un certificate client approuvé par le server. Toute personne sera rejetée.

Configuration WCF du server:

 <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="DefaultBehavior"> <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="true" /> <serviceCredentials> <clientCertificate> <authentication certificateeValidationMode="ChainTrust" /> </clientCertificate> <serviceCertificate findValue="64343ee2c8338518e78ba698f3936dc92c90db57" x509FindType="FindByThumbprint" /> </serviceCredentials> </behavior> </serviceBehaviors> </behaviors> <bindings> <wsHttpBinding> <binding name="DefaultBinding"> <security mode="TransportWithMessageCredential"> <transport clientCredentialType="Certificate" /> <message clientCredentialType="Certificate" /> </security> </binding> </wsHttpBinding> </bindings> <services> <service name="WebService.Service" behaviorConfiguration="DefaultBehavior"> <endpoint address="" binding="wsHttpBinding" bindingConfiguration="DefaultBinding" contract="WebService.IService" /> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> </services> </system.serviceModel> 

Configuration du WCF client.

 <system.serviceModel> <behaviors> <endpointBehaviors> <behavior name="DefaultBehavior"> <clientCredentials> <clientCertificate storeLocation="LocalMachine" findValue="d084c91a8f81878cd4dd991bbab348235f0fd1a3" x509FindType="FindByThumbprint" /> <serviceCertificate> <authentication certificateeValidationMode="ChainTrust" /> </serviceCertificate> </clientCredentials> </behavior> </endpointBehaviors> </behaviors> <bindings> <wsHttpBinding> <binding name="WSHttpBinding_IService"> <security mode="TransportWithMessageCredential"> <transport clientCredentialType="Certificate" /> <message clientCredentialType="Certificate" /> </security> </binding> </wsHttpBinding> </bindings> <client> <endpoint address="https://host/WebService/Service.svc" behaviorConfiguration="DefaultBehavior" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService" contract="WebService.IService" name="WSHttpBinding_IService"> </endpoint> </client> </system.serviceModel> 

One Solution collect form web for “Configurer IIS pour exiger un certificate client et utiliser une authentification anonyme”

D'accord, nous avons fait la même chose que vous. Nous avons travaillé dans le sens inverse. Nous avons d'abord sécurisé IIS avec le certificate client et server. Nous l'avons fait sur IIS Express (toujours en développement pendant que je publie ceci). Nous avons autorisé dans IIS express applicationhost.config pour écraser certaines parties du web.config. C'est-à-dire: <section name="windowsAuthentication" overrideModeDefault="Allow" />

Configuration côté server

 <sytem.serviceModel> <bindings> <wsHttpBinding> <binding name="ClientCert"> <security mode="Transport"> <transport clientCredentialType="Certificate" /> </security> </binding> </wsHttpBinding> </bindings> <behaviors> <!--We have a custom service behavior for claim based security --> <behavior name="wsHttpCertificateBehavior"> <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" /> <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true" /> <serviceAuthorization serviceAuthorizationManagerType="MyNamespace.AdamAuthorizationManager, MyAssembly"> <authorizationPolicies> <add policyType="MyNamespace.AdamAuthorizationPolicy, MyAssembly" /> </authorizationPolicies> </serviceAuthorization> <serviceCredentials> <serviceCertificate findValue="YourServerCertificateNameWithoutCN=" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="My" /> <clientCertificate> <authentication revocationMode="NoCheck" mapClientCertificateToWindowsAccount="true" /> </clientCertificate> </serviceCredentials> </behavior> </behaviors> <services> <service name="MyNamespace.OrderService" behaviorConfiguration="wsHttpCertificateBehavior"> <endpoint address="https://iisurl/OrderService.svc/ClientCert" contract="wsHttpCertificateBehavior.IOrderService" binding="wsHttpBinding" bindingConfiguration="ClientCert"> </endpoint> </service> </services> </sytem.serviceModel> <system.webServer> <security> <authentication> <windowsAuthentication enabled="true" /> <anonymousAuthentication enabled="true" /> <iisClientCertificateMappingAuthentication defaultLogonDomain="YourDomain" enabled="true" oneToOneCertificateMappingsEnabled="true"> <oneToOneMappings> <add enabled="true" certificatee="Base64HashOfTheCertificate" userName="YourUserName" password="YourPassword" /> </oneToOneMappings> </iisClientCertificateMappingAuthentication> </authentication> <authorization> <add users="*" accessType="Allow" /> </authorization> <!--Require SSL *AND* require a client certificatee --> <access sslFlags="Ssl, SslNegotiateCert, SslRequireCert" /> </security> </system.WebServer> 

Sur le client:

 <system.serviceModel> <wsHttpBinding> <binding name="ClientCertificate"> <security mode="Transport"> <transport clientCredentialType="Certificate"/> </security> </binding> </wsHttpBinding> <behaviors> <endpointBehaviors> <behavior name="wsHttpCertificateBehavior"> <clientCredentials> <clientCertificate findValue="YourClientCertificateNameWithoutCN=" storeLocation="CurrentUser" storeName="My" x509FindType="FindBySubjectName"/> <serviceCertificate> <authentication revocationMode="NoCheck"/> </serviceCertificate> </clientCredentials> </behavior> </endpointBehaviors> </behaviors> <client> <endpoint name="ClientCertificate" address="https://iisurl/OrderService.svc/ClientCert" contract="MyNamespace.IOrderService" binding="wsHttpBinding" bindingConfiguration="ClientCertificate" behaviorConfiguration="wsHttpCertificateBehavior"> </endpoint> </client> </system.serviceModel> 

Ce qui nous a beaucoup aidé a été de permettre le suivi, la connection au service, la politique d'autorisation personnalisée et les journaux de suivi d'IIS.

Nous avons iisurl mappé à 127.0.0.1 dans notre file hôte, nous avons donc fait confiance à des certificates. Pour iisClientCertificationMapping, vérifiez ceci .

Ne sait pas si votre configuration ssl est correcte. Nous avons un script powershell pour cela. Quelques parties de celui-ci:

Génération du certificate racine (powershell)

 Invoke-Command -ScriptBlock{ . "C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\makecert.exe" -n "CN=YourRootCA" -r -sv YourRootCA.pvk YourRootCA.cer} $certFile = get-childitem $exPath | where {$_.FullName -match "GlobalVisionServicesRootCA.cer"} if ($certFile -ne $NULL) { echo "Discovered the YourRootCA.cer in the same folder as this script, installing it in the LocalMachine\Root certificatee store.." $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($certFile.FullName) $rootStore = new-object system.security.cryptography.x509certificatees.x509Store 'Root','LocalMachine' $rootStore.Open('ReadWrite') $rootStore.Add($cert) $rootStore.Close() } 

Génération du certificate du server (command line):

 makecert.exe -sk YourDevSrvCert -iv YourRootCA.pvk -n "CN=iisurl" -ic YourRootCA.cer -sr localmachine -ss my -sky exchange -pe yourservercertificatee.cer 

Génération du client server (command line):

 makecert.exe -sk ClientDevSrvCert -iv YourRootCA.pvk -n "CN=iisurl" -ic GlobalVisionServicesRootCA.cer -sr localmachine -ss my -sky exchange -pe iisurl.cer 

Relier les certificates à IIS (command line, spécifique à XP):

 httpcfg.exe delete ssl -i "0.0.0.0:443" httpcfg.exe" delete urlacl url="https://iisurl:443/" httpcfg.exe set urlacl url="https://iisurl:443/" user=Everyone httpcfg.exe" set ssl -i "0.0.0.0:443" -h ThumpPrint 

modifiez ThumpPrint à l'adresse ThumpPrint du certificate avec le nom de l'object iisurl. Je vous recommand de l'automatiser entièrement avec powershell, nous l'avons fait, afin que nous puissions développer sur plusieurs machines. Mais je ne peux pas passer tout cela ici.

J'espère que ceci vous aide. Avec cette configuration, si vous naviguez sur https vers l'URL iisurl / OrderService, il vous request un certificate client. (Dans IE)

Vous pouvez également regarder ce journal: C: \ WINDOWS \ system32 \ Logfiles \ HTTPERR

  • Cryptage de MSMQ
  • Comment configurer un routeur réseau pour transférer (retransmettre) une découverte rapide
  • Service situé sur le réseau
  • Comment déterminer les exigences matérielles
  • Application WCF Déployer dans IIS, mais la connection à la database SQL Server ne fonctionne pas
  • Problème d'activation de la fonctionnalité "Activation non HTTP de Windows Communication Foundation" dans Windows 7
  • Pourquoi la security de Kerberos est-elle insuffisante pour notre server proxy ADFS?
  • Autorisations de dossier IIS7
  • Le moyen le plus sécurisé de connection d'un intranet à un server externe
  • IIS sur localhost est très lent
  • Une modification du file Web.Config nécessitera-t-elle de redémarrer IIS?
  • Les astuces du serveur de linux et windows, tels que ubuntu, centos, apache, nginx, debian et des sujets de rĂ©seau.