locked
WCF Sichere TCP-Verbindung via Router? RRS feed

  • Frage

  •  

     

    Hallo,

    anhand diverser Informationen aus MSDN, Blogs und Community habe ich einen WCF - Service mit netTCPBinding erstellt, und später noch einen Router hinzugefügt. Das funktioniert glänzend, solange auf Sicherung verzichtet wird.

    Inzwischen habe ich es soweit, dass die Verbindung zwischen Service und Client auch mit Sicherheitsfunktionen funktioniert. Den Client-Endpunkten musste ich noch eine DNS-Identität hinzufügen.

     

    <!--Binding-->
    <netTcpBinding>  
     <binding name ="Certificate">
      <security mode="TransportWithMessageCredential">
        <transport clientCredentialType="Certificate" protectionLevel="EncryptAndSign" /> 
        <message clientCredentialType="Windows" algorithmSuite="Basic128"/>
      </security>
     </binding>
    </netTcpBinding/>
    <!--endpointBehavior-->
    <clientCredentials>
     <clientCertificate storeLocation="LocalMachine" storeName="My "x509FindType="FindBySubjectName"/>
     <serviceCertificate>
      <authentication certificateValidationMode="None" trustedStoreLocation="LocalMachine"/>
     </serviceCertificate>
    </clientCredentials>
    

    Am Server ist folgende Code hinzugekommen (das Binding ist identisch zu Client):

     <behavior name="certificateBehavior">
    <serviceMetadata httpGetEnabled="false"/>
    <serviceDebug includeExceptionDetailInFaults="true"/>
    <serviceCredentials>
      <serviceCertificate storeName="My" storeLocation="LocalMachine" x509FindType="FindBySubjectName"/>
      <clientCertificate>
       <authentication certificateValidationMode="None" trustedStoreLocation="LocalMachine"/>
      </clientCertificate>
    </serviceCredentials>
    </behavior>

    Die Verbindung direkt zwischen Client und Server funktioniert auf diese Weise.  Bei Verbindung über den Router kommt eine unklare Fehlermeldung.

    Der Server hat keine sinnvolle Antwort gegeben; dies kann durch einen nicht übereinstimmenden Vertrag, ein vorzeitiges Herunterfahren der Sitzung oder durch einen internen Serverfehler verursacht sein.

    Wie könnte ich den Router oder den Server so erweitern, dass ich mehr Informationen dazu erhalte? Der Router ist mit dem RoutingService aus dem Framework 4 erstellt.Der Router ist momentan mit dem IRequestReplyRouter-Contract versehen. Der Code am Router betreffend Security ist gleich zum Code aus Client und Server, da der Router ja beide Funktionen ausführen muss.

    Wo liegt mein Fehler?

    Vielen Dank,

    Montag, 18. Oktober 2010 09:31

Alle Antworten

  • Hallo,

    inzwischen funktioniert der Router. Vermutlich waren irgendein Binding-Contract falsch. Desweiteren hab ich das Zertificat noch in die ClientCredentials integrieren müssen.

    Der Router funktioniert allerdings momentan nur im Security.Mode = Transport

    <security mode="Transport">
       <transport clientCredentialType="Certificate" protectionLevel="EncryptAndSign" />
       <message clientCredentialType="Windows" />
    </security>

    Jedoch möchte ich gern den Modus TransportWithClientCredentials verwenden.

    <security mode = " TransportWithMessageCredential " >
       <transport clientCredentialType = " Certificate " protectionLevel = " EncryptAndSign " /> 
       <message clientCredentialType = " UserName " /> 
    </security>
    Inzwischen funktioniert dies zwischen Client und Service super.

    Wie muss man den Router dafür anpassen? Benötigt der Router ebenfalls folgende Validierung?

    host.Credentials.UserNameAuthentication.UserNamePasswordValidationMode = System.ServiceModel.Security.UserNamePasswordValidationMode.Custom; 
    host.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new
    
     TestService1.UserValidator();
    
    Ich hofffe nicht. Der Router sollte möglichst unabhängig vom Service und einfach Man-in-the-Middle bleiben.

     

    Ideen?

     

    Gruss,

    Mathias

     

    Dienstag, 19. Oktober 2010 08:30
  • Hallo,

     

    ich habe (genau?) das gleiche Problem. Die Verbindung zw. Client und Service funktioniert ohne den Router ganz hervorragend (Auch Transportwithmessagecredential), wenn ich allerdings den Router zwischenschalte, meldet der client:

     

    {"An unsecured or incorrectly secured fault was received from the other party. See the inner FaultException for the fault code and detail."}

    und inner:

    {"An error occurred when verifying security for the message."}

     

    Einen Validator habe ich schon einmal ausprobiert, aber das klappt (bei mir) nicht.

    Bitte Helfen!

     

    Danke

    Jens.


    JEns D.
    Dienstag, 23. November 2010 13:43