WCF NetTcpBinding de Sécurité - comment ça fonctionne?

je rencontre les problèmes suivants en essayant de travailler à travers le bourbier des réglages de la WCF...

j'ai créé un service client-serveur WCF en utilisant une liaison NetTcp. Je n'ai pas modifié les paramètres de sécurité et quand je tourne sur une machine, cela fonctionne très bien. Cependant, quand j'ai lancé mon client depuis une autre machine, il s'est plaint que le serveur n'aimait pas les informations de sécurité qui ont été envoyées.

je comprends que NetTCP est "sécurisé" par défaut et que mon client aurait passé les mauvais détails de sécurité - à savoir le nom D'utilisateur Windows et le mot de passe (ou une certaine forme d'authentification de domaine) à mon serveur qui comme ils ne sont pas en cours d'exécution sur le même domaine qu'il n'aurait pas aimé.

mais ce que je ne comprends pas, c'est comme suit:

Je n'ai pas spécifié de sécurité dans ma reliure - les paramètres standards s'attendent-ils à ce qu'un nom D'utilisateur ou un mot de passe Windows soit envoyé?

Je ne sais pas est - ce qu'un certificat a été installé sur mon serveur - je comprends que les liaisons NetTCP ont besoin d'une certaine forme de clé publique privée pour protéger les justificatifs d'identité - mais cela semble fonctionner quand le client et le serveur sont sur la même machine-comment les données sont-elles cryptées? Ou le veut comme WCF savait qu'il était sur la même machine et le cryptage n'est pas nécessaire?

j'ai dû régler mon mode de sécurité sur mon client et serveur à "none" maintenant et ils se connectent bien. Cependant est-il un moyen de crypter mes données sans un certificat?

Enfin... Quelle est la différence entre le Transport et la sécurité des messages?

Pour vérifier ma compréhension (excusez le scénario!) la sécurité des messages est comme si j'envoyais une lettre de la personne A à la personne B et que je codais mon écriture manuelle pour m'assurer que si quelqu'un l'intercepte, il ne peut pas la lire? La sécurité du Transport est si je décide de faire envoyer ma lettre par un transport armé de sorte que personne ne peut y accéder en cours de route?

Est-il possible de toute forme de cryptage dans WCF sans un certificat? Mon projet est un projet privé et je ne veux pas acheter un certificat et les données ne sont pas sensibles de toute façon si c'est juste pour ma propre connaissance.

24
demandé sur Peter Mortensen 2010-03-29 12:11:00

1 réponses

le type de justificatif d'identité de client par défaut pour NetTcpBinding est L'authentification Windows. Pour que L'authentification Windows fonctionne, le client et le serveur doivent être dans le même domaine, ou dans des domaines de confiance mutuelle (que dans votre cas vous n'avez pas).

si le client et le serveur étaient tous deux sur le même domaine, WCF s'occuperait de la mécanique de L'authentification Windows "en coulisse". Et quand le client et le serveur sont sur la même machine, ils sont effectivement dans le même domaine, de sorte Windows peut utiliser ses propres mécanismes pour gérer le chiffrement et le déchiffrement. Il ne le fera toutefois qu'à l'intérieur de domaines de confiance mutuelle.

si vous n'avez pas de domaines client et serveur mutuellement fiables, alors le client et le serveur doivent avoir un autre moyen de déterminer s'ils se font confiance avec leurs clés. C'est là que les certificats entrent en jeu. Le client et le serveur ont leurs propres certificats (ou le serveur peut délivrer un certificat au client).

Transport la sécurité, c'est comme le chiffrement de l'extérieur de l'enveloppe ainsi que l'intérieur. L'inconvénient est que si vous avez à passer l'enveloppe à quelqu'un en dehors de votre propre organisation, ils ont besoin d'une clé de déchiffrement, juste pour savoir où l'enveloppe est censé aller, maintenant, ils peuvent lire le message dans l'enveloppe. D'un autre côté, la sécurité des transports est plus rapide-elle nécessite moins de données de sécurité qui sont transmises avec votre enveloppe.

la sécurité des messages crypte votre message, mais le l'enveloppe peut être lue par le personnel postal (internet et ses routeurs). Seulement la source et la destination ont les clés pour décrypter le message, mais les intermédiaires peuvent acheminer votre message.

pour résumer: pour utiliser le chiffrement sur le NetTcpBinding le client et le serveur doivent être dans un domaine (ou des domaines de confiance mutuelle) ou vous devez avoir un certificat d'échange de clé.


Edit: on m'a demandé un exemple de code--Voici un lien element in XAML. Elle serait normalement placée dans un élément liant NetTcp.

<binding name="Secure" listenBacklog="4000" receiveTimeout="00:20:00" sendTimeout="00:20:01" 
   maxReceivedMessageSize="2147483647" maxConnections="200" portSharingEnabled="true">
   <!-- ~2 GB -->
   <readerQuotas maxStringContentLength="2147483647"/>
   <!-- ~2 GB max string content length -->
   <security mode="Message">
      <transport clientCredentialType="None" protectionLevel="EncryptAndSign"/>
      <message clientCredentialType="None"/>
   </security>
</binding>

la partie importante est l'élément de sécurité. Pour la Sûreté du transport, on changerait l'attribut mode En "Transport". Plus que probablement, le clientCredentialType ne serait pas" None "mais plutôt" Certificate"," Ntlm", ou" Windows " selon le contexte.

31
répondu Matt Smith 2016-11-14 12:44:22