Selbst gehosteter WCF-Dienst mit gegenseitigem SSL (zwischen Dienst und Client) schlägt mit 403 Forbidden fehl

Ich versuche, eine Demo von Mutual SSL zwischen aselbst gehostet WCF-Dienst und eine Client-App (Eingabeaufforderung für den Moment). Am Ende versuche ich, eine Lösung zu finden, bei der ichTransportsicherheit (keine Nachrichtensicherheit) zwischen einem Server, der ein Zertifikat für eingehende Verbindungen verwendet, und mehreren Clients mit jeweils eigenen Zertifikaten, mit denen ich jeden der Clients eindeutig identifizieren kann.

Ich habe verschiedene Ansätze ausprobiert, aber keiner hat funktioniert (ich konnte kein genaues Beispiel für das finden, was ich versucht habe). Jedes Mal, wenn ich denke, dass ich in der Nähe bin, kommt es im Client zu einer Ausnahme, wenn ich versuche, den Service aufzurufen. Die häufigste Ausnahme, auf die ich gestoßen bin, ist:

“The HTTP request was forbidden with client authentication scheme 'Anonymous'.”
Inner exception: "The remote server returned an error: (403) Forbidden."

Hat jemand irgendwelche Gedanken darüber, was ich falsch gemacht haben könnte oder vielleicht eine bessere Anleitung zum Einrichten von gegenseitigem SSL im obigen Szenario?

Vollständige Offenlegung - Ab sofort werden sowohl der Client als auch der Server auf demselben Computer ausgeführt. Ich bin mir nicht sicher, ob das wichtig ist.

Konfigurationsschnipsel unten

Der Service- und Client-Code ist relativ trivial, daher bin ich ziemlich zuversichtlich, dass ich sie zum Laufen gebracht habe. Die App-Konfigurationen (insbesondere die Bindungen und Verhaltensweisen) und Zertifikate sind "interessanter", daher bin ich dort nicht so sicher.

Wie ich die Zertifikate erstellt habe (aktuelle Befehle wörtlich)

makecert -pe -n "CN=SelfSignedCA" -ss Root -sr LocalMachine  -a sha1 -sky signature -r -sv "SelfSignedCA.cer" "SelfSignedCA.pvk"
makecert -pe -n "CN=system" -ss my -sr LocalMachine -a sha1 -sky exchange -eku 1.3.6.1.5.5.7.3.1  -in "SelfSignedCA" -is Root -ir LocalMachine -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 Service.cer
makecert -pe -n "CN=client1" -ss my -sr LocalMachine -a sha1 -sky exchange -eku 1.3.6.1.5.5.7.3.1  -in "SelfSignedCA" -is Root -ir LocalMachine -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 Client1.cer

Assoziieren des Zertifikats mit dem Port (tatsächliche Befehle wörtlich)

netsh http add urlacl url=https://+:44355/MyService/ user=EVERYONE

Server Einstellungen

Bindungen:

  <wsHttpBinding>
    <binding name="CustomBinding">      
      <security mode="Transport">
        <transport clientCredentialType="Certificate"/>
      </security>
    </binding>
  </wsHttpBinding>

Verhalten:

    <serviceBehaviors>
      <behavior name="">
      <!--
      <serviceCredentials>
        <serviceCertificate
           findValue="system"
           storeLocation="LocalMachine"
           storeName="My"
           x509FindType="FindBySubjectName"/>
      </serviceCredentials>
      -->
      <serviceAuthorization
         serviceAuthorizationManagerType=
              "ClientAuthorization.ClientCertificateAuthorizationManager, Simulator.Service.SideA" />
    </behavior>
  </serviceBehaviors>

Klient

Bindungen:

  <wsHttpBinding>
    <binding name="CustomBinding">      
      <security mode="Transport">
        <transport clientCredentialType="Certificate"/>
      </security>
    </binding>
  </wsHttpBinding>

Verhaltensweisen

  <endpointBehaviors>
    <behavior name="ChannelManagerBehavior">
      <clientCredentials>
         <clientCertificate findValue="client1"
                           storeLocation="LocalMachine"
                           storeName="My"
                           x509FindType="FindBySubjectName" />
        <!--
        <serviceCertificate>
          <authentication certificateValidationMode="PeerOrChainTrust"/>
        </serviceCertificate>
        -->
      </clientCredentials>
     </behavior>
  </endpointBehaviors>

AKTUALISIEREN

Daher habe ich dem Server einen benutzerdefinierten Benutzernamen und ein benutzerdefiniertes Kennwort hinzugefügt, um das Standardverhalten zu überschreiben und unabhängig von den angegebenen Anmeldeinformationen immer zuzulassen (ich möchte auch hier keine Überprüfung von Benutzernamen und Kennwort).Dieser Validator wird niemals aufgerufen. Der Client erhält weiterhin die Ausnahme "Authentifizierungsschema" Anonym ".

Aktualisierung des Serviceverhaltens

  <serviceCredentials>
    <userNameAuthentication 
      userNamePasswordValidationMode="Custom"
      customUserNamePasswordValidatorType=
        "Service.ClientAuthorization.ClientUserNamePasswordValidatorManager, Service.SideA" />
  </serviceCredentials>

Antworten auf die Frage(5)

Ihre Antwort auf die Frage