2016-07-28 11 views
0

Also nach MSDN durchforstet, unzählige Artikel und sogar SO - ich habe immer noch nichts zu zeigen für Tage des Kampfes.WCF wsHttpBinding Zertifikat Security Negotiation Ausnahme

So habe ich dies: WCF-Dienst muss von einem Client verbraucht werden und ich nur ein SecurityNegotiationException

Sichere Kanal geöffnet werden kann, nicht schlagen, weil die Sicherheit Verhandlungen mit dem Remote-Endpunkt fehlgeschlagen. Dies kann an einer fehlenden oder falsch angegebenen EndpointIdentity in der EndpointAddress liegen, die zum Erstellen des Kanals verwendet wird. Überprüfen Sie, ob die von EndpointAddress angegebene oder implizierte EndpointIdentität den Remote-Endpunkt korrekt identifiziert.

Ich habe diesen Fehler im ganzen Netz gesehen und niemand scheint mein genaues Szenario zu haben (mit einer machbaren Antwort atleast).

Meine Konfiguration ist lokal und wird nicht von IIS gehostet (vorerst), sondern über Visual Studios 2010 gehostet. Meine GenericIntegration (WCF-Dienst) verwendet wsHttpBinding (Message Mode) authentifiziert durch Zertifikate (Ich habe einen sehr benutzerdefinierten Benutzernamen/Kennwortauthentifizierung + Berechtigungsklasse wurde als Parameter als Entwurf übergeben) und die Sicherheitsmaßnahmen werden nicht zurückgenommen.

Hosts Config

<system.serviceModel> 
<bindings> 
    <wsHttpBinding> 
    <binding name="wsHttpEndpintBinding"> 
     <security mode ="Message"> 
     <message clientCredentialType="Certificate" establishSecurityContext="false" negotiateServiceCredential="false"/> 
     </security> 
    </binding> 
    </wsHttpBinding> 
</bindings> 
<services> 
    <service behaviorConfiguration="wsHttpBehaviour" name="GenericIntegration.GenericService"> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsHttpEndpintBinding" 
     name="wsHttpEndpoint" contract="GenericIntegration.GenInterface" /> 
    <host> 
     <baseAddresses> 
     <!--<add baseAddress="http://localhost:59082/GenericService.svc" />--> 
     </baseAddresses> 
    </host> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="wsHttpBehaviour"> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
     <serviceCredentials> 
     <clientCertificate> 
      <certificate findValue="GenIntegrationClient" storeName="My" storeLocation="LocalMachine" x509FindType="FindBySubjectName" /> 
      <authentication certificateValidationMode="PeerTrust" /> 
     </clientCertificate> 

     <serviceCertificate findValue="GenIntegrationClient" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" /> 
     </serviceCredentials> 
    </behavior> 
    <behavior name="metadataBehavior"> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors>  

<serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 

Und die Config-Client-

<system.serviceModel> 
    <behaviors> 
     <endpointBehaviors> 
      <behavior name="endpointBehaviour"> 
       <clientCredentials> 
        <clientCertificate findValue="GenIntegrationClient" storeLocation="LocalMachine" storeName="My" 
         x509FindType="FindBySubjectName" /> 
        <serviceCertificate> 
        <authentication certificateValidationMode="PeerTrust" revocationMode="NoCheck"/> 
        </serviceCertificate> 
       </clientCredentials> 
      </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="wsHttpEndpoint" maxBufferPoolSize="20000000" maxReceivedMessageSize="20000000"> 
       <security mode="Message"> 
        <message clientCredentialType="Certificate" /> 
       </security> 
      </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:59082/GenericService.svc" 
      binding="wsHttpBinding" bindingConfiguration="wsHttpEndpoint" behaviorConfiguration="endpointBehaviour" 
      contract="GenService.GenInterface" name="wsHttpEndpoint"> 
      <identity> 
       <certificate encodedValue="AwAAAAEAAAAUAAAAKdyUELIKMtdh2MFsYQ09ja+vyeEgAAAAAQAAACICAAAwggIeMIIBi6ADAgECAhCFBfF1EXQZhkPKaBpQCl84MAkGBSsOAwIdBQAwJDEiMCAGA1UEAxMZNE1PU1RHZW5JbnRlZ3JhdGlvblNlcnZlcjAeFw0xNjA3MjgxNDQ5MjVaFw0zOTEyMzEyMzU5NTlaMCQxIjAgBgNVBAMTGTRNT1NUR2VuSW50ZWdyYXRpb25DbGllbnQwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAIwsIlz5nZ3HxeYofTpYKr6RcfQMe/jZxPuHcljT+8pBOZ6KmYcyxeRTO074yP6yF8b1IqFskII+qqmCT8nDsb8xdo5Ee0oqL1LKR+xeTgg2ZXXoocxqR1AdxWFVdlMxMSjKIEGE+MnSDdB6vgXahhpUbAS7cdrNoAFKNIz+vrt1AgMBAAGjWTBXMFUGA1UdAQROMEyAEB4cu6OjBqQHct6przmowGyhJjAkMSIwIAYDVQQDExk0TU9TVEdlbkludGVncmF0aW9uU2VydmVyghD75YH5y52zsU5wcmZLJzPiMAkGBSsOAwIdBQADgYEA2BinUmEfgZKcb1qFD1T5ajc2OWHGLjDLpDi8Y7amM4P3rFGvelx7NmCNUH88iGS9LcbDsmY59HcZwUavtPOr4LMRDhl+5YuGht1fIYEk8QSDIhjevijgDOIVBBAeNIA8tva1faMNtYnFXsj0VxMvlrZ4exeKFVFjv2sib5YNFxY=" /> 
      </identity> 
     </endpoint> 
    </client> 
</system.serviceModel> 

Nun zu den Zertifikaten (und ja das ist nur zum Testen): GenIntegrationServer. cer war es erstellt als selbstsigniertes CA-Stammzertifikat mit einem privaten Schlüssel zum Signieren von Client-Zertifikaten mit. Die Zertifikate GenIntegrationServer und GenIntegrationClient wurden mit makecert generiert. Das Clientzertifikat ist mit dem privaten Schlüssel verknüpft und wird im persönlichen Speicher ordnungsgemäß installiert.

Ich bin immer noch ziemlich neu bei Zertifikaten, privaten Schlüsseln und sicheren Verbindungen - ich kann einfach nicht nachvollziehen, wo ich meinen Fehler mache. Ich habe nicht zu viele Posts darüber gefunden, Zertifikate auf diese Weise spezifisch zu verwenden.

Kann mir jemand helfen, bevor ich mehr Haare verliere oder darüber schlafe?

UPDATE

Wie pro Antrag, fügte ich die Protokollierung. Aber das meiste, das sie enthüllen, ist:

Leider verstehe ich noch nicht, warum Sicherheitsvalidierung versagt. Irgendwelche Ideen?

+0

Konfigurieren Sie den Service-Client und den Host für die ausführliche Protokollierung (https://msdn.microsoft.com/en-us/library/ms733025(v=vs.110).aspx). Dies sollte Ihnen eine bessere Vorstellung davon geben, was intern fehlschlägt, wenn die Verhandlung fehlschlägt. Verwenden Sie diese Informationen, um entweder das Problem zu lösen oder eine spezifischere Frage zu stellen, sobald Sie weitere Informationen haben. – asawyer

+0

Ein häufiges Problem, das ich mit Setup hatte, ist, dass das IIS-Dienstkonto keine Leseberechtigungen für den privaten Schlüssel hat. Installieren Sie die WSE3.0-Tools, und verwenden Sie dann das Zertifikat-Tool, um die Berechtigung für den privaten Schlüssel zu erteilen. – asawyer

+0

Die Protokollierung wurde wie gewünscht hinzugefügt. Ich werde meine Frage mit den Ergebnissen bearbeiten. – Medismal

Antwort

-1

Es stellte sich heraus, dass ich die Zertifikate zu verschiedenen Geschäften hinzufügen musste.

Zusätzlich zu den bereits in den persönlichen Speichern (wie durch die Konfiguration angezeigt) festgelegten Zertifikaten musste ich das Zertifikat des Servers auf dem Client installieren und umgekehrt. Ich musste auch sicherstellen, dass der Client den persönlichen Schlüssel des Client-Zertifikats und das gleiche mit dem Server enthielt.

Das klingt nicht zu vollständig, aber ich werde einen vollständigen Artikel darüber, wie ich das getan habe.

+0

Wenn Sie eine Lösung für Ihre eigene Frage gefunden haben, beachten Sie, dass Sie Ihre eigene Antwort als die richtige Antwort markieren dürfen. –

Verwandte Themen