fragen stichworte

Richten Sie IIS ein, um ein Client-Zertifikat anzufordern und anonyme Authentifizierung zu verwenden

Richten Sie IIS so ein, dass ein Clientzertifikat erforderlich ist und die anonyme Authentifizierung

verwendet wird

Ich habe einen WCF-Webservice für unsere Kunden. Ich möchte dies mit Client-Zertifikaten schützen. Ich werde auch das Client-Zertifikat verwenden, um den Kunden zu identifizieren.

Ich habe den Identifikationsteil zum Laufen gebracht, aber ich kann nicht machen, dass der IIS Client-Zertifikate benötigt.

Wenn ich den IIS so eingestellt habe, dass er Clientzertifikate akzeptiert, funktioniert die Kommunikation und ich kann die Clientidentität mithilfe von

abrufen
ServiceSecurityContext.Current.PrimaryIdentity.Name

Ich kann aber auch ohne Client-Zertifikat auf die Site zugreifen. Ich bin mir nicht sicher, ob diejenigen, die nicht in der Lage sind, etwas anderes tun können, als die WSDL zu lesen, aber ich möchte nicht, dass jemand ohne ein vertrauenswürdiges Zertifikat überhaupt Informationen erhalten kann.

Wenn ich den IIS so eingestellt habe, dass er ein Client-Zertifikat erfordert, wird mein Testclient, der Zugriff haben sollte, mit dem Fehler

versehen

The HTTP request was forbidden with client authentication scheme 'Anonymous'.

Ich möchte nur denjenigen Zugriff gewähren, die über ein vom Server vertrauenswürdiges Clientzertifikat verfügen. Jeder andere wird abgelehnt.

Server-WCF-Konfiguration:

<system.serviceModel>
  <behaviors>
    <serviceBehaviors>
      <behavior name="DefaultBehavior">
        <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
        <serviceDebug includeExceptionDetailInFaults="true"/>
        <serviceCredentials>
          <clientCertificate>
            <authentication certificateValidationMode="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>

Client-WCF-Konfiguration.

<system.serviceModel>
  <behaviors>
    <endpointBehaviors>
      <behavior name="DefaultBehavior">
        <clientCredentials>
          <clientCertificate storeLocation="LocalMachine" findValue="d084c91a8f81878cd4dd991bbab348235f0fd1a3" x509FindType="FindByThumbprint"/>
          <serviceCertificate>
            <authentication certificateValidationMode="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>

antworten

Ok, wir haben dasselbe gemacht wie Sie. Wir haben umgekehrt gearbeitet. Wir haben IIS zuerst mit dem Kunden gesichert. Serverzertifikat Wir haben dies auf IIS Express gemacht (noch in der Entwicklung, während ich dies poste). Wir haben in IIS express applicationhost.config erlaubt, bestimmte Teile der web.config zu überschreiben. I.e .: <section name="windowsAuthentication" overrideModeDefault="Allow"/>

Serverseitige Konfiguration:

<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" certificate="Base64HashOfTheCertificate" userName="YourUserName" password="YourPassword"/>
          </oneToOneMappings>
        </iisClientCertificateMappingAuthentication>
      </authentication>
      <authorization>
        <add users="*" accessType="Allow"/>
      </authorization>
      <!--Require SSL *AND* require a client certificate -->
      <access sslFlags="Ssl, SslNegotiateCert, SslRequireCert"/>
    </security>
</system.WebServer>

Auf dem 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>

Was uns sehr geholfen hat, war das Aktivieren der Nachverfolgung, der Protokollierung des Dienstes und der benutzerdefinierten Berechtigungsrichtlinie sowie der IIS-Ablaufverfolgungsprotokolle.

Wir haben iisurl in unserer Host-Datei 127.0.0.1 zugeordnet, sodass wir den Zertifikaten vertrauen. Für das iisClientCertificationMapping prüfen Sie this.

Ich weiß nicht, ob Ihr SSL-Setup korrekt ist. Dafür haben wir ein Powershell-Skript. Einige Teile davon:

Generieren des Stammzertifikats (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 certificate store.." 
        $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($certFile.FullName)
        $rootStore = new-object system.security.cryptography.x509certificates.x509Store 'Root','LocalMachine'
        $rootStore.Open('ReadWrite')
        $rootStore.Add($cert) 
        $rootStore.Close() 
    }

Generieren des Serverzertifikats (Befehlszeile):

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

Server-Client (Befehlszeile) generieren:

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

Binden der Zertifikate an IIS (Befehlszeile, XP-spezifisch):

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

Ändern Sie den ThumpPrint in den ThumpPrint des Zertifikats mit dem Betreffnamen iisurl. Ich empfehle Ihnen, dies vollständig mit Powershell zu automatisieren. Wir haben dies vor, damit wir auf mehreren Maschinen entwickeln können. Aber ich kann hier nicht alles hinter sich lassen.

Ich hoffe, das hilft Ihnen. Wenn Sie mit dieser Konfiguration über https nach der URL iisurl/OrderService navigieren, werden Sie nach einem Clientzertifikat gefragt. (Im IE)

Sie können dieses Protokoll auch überwachen: C: \ WINDOWS \ system32 \ Logfiles \ HTTPERR