10
votes

Certificat de service WCF et identité du point d'extrémité côté client - Pourquoi cela ne fonctionne pas?

[Mise à jour] - Je joint également des fichiers de configuration complètes, pour Service et pour Client (à l'extérieur d'ici, de ne pas inonder le sujet)

J'ai une situation à peu près identique à la on a décrit dans Cette question, mais ma question est quelque peu différente . P>

  • J'utilise netcpbinding avec sécurité défini sur le transportwithmessagEcreDential li>
  • J'utilise mot de passe / nom d'utilisateur Critiques sauvegardées par ASP.NET Fournisseur Li>
  • Mon service est auto-hébergé dans Windows Service LI>
  • i faire strong> dans mon comportement du point d'extrémité Authentification spécifiée REVOCATIONMODE = "NOCHECK" LI> ul>

    Il est nécessaire que le service fournisse un certificat s'authentifier à des clients. C'est bon, je viens de faire: p>

    <Identity>
       <Dns>Foo</Dns>
    </Identity>
    


0 commentaires

5 Réponses :


0
votes

Vous êtes corect et presque fini de configurer la configuration du client. Il vous manque une dernière chose (comme mentionné dans la description de l'erreur): Vous devez définir la révocationMode sur NOCHECK dans la configuration:

<behavior name="X509SecureBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceCredentials>
            <serviceCertificate storeName="My" storeLocation="CurrentUser" x509FindType="FindByThumbprint" findValue="aaaa" />
            <clientCertificate>
              <authentication certificateValidationMode="None" revocationMode="NoCheck" />
            </clientCertificate>
          </serviceCredentials>
        </behavior>


6 commentaires

Désolé, j'ai oublié de mentionner que j'ai cette option définie. J'ai mis à jour la question en conséquence. Quoi qu'il en soit, le certificat semble être ignoré indépendamment de ce que je précise ici.


Pourriez-vous poster un fichier de configuration complet? ou la partie importante de celui-ci?


Bien sûr, je peux, je les ai lié, car ils sont assez gros, et je ne veux pas effrayer des personnes potentiellement utiles en les noyant en tonnes de XML


Je ne grume pas, mais cette solution ne le coupe pas pour moi :(


Je ne suis pas sûr de comprendre ce que tu veux dire? Il ne fonctionne pas ou vous ne pouvez pas modifier la configuration du serveur à partir d'autres raisons?


Jetez un coup d'œil à ma question mise à jour (en bas). Fondamentalement, il fait l'exception disparle et appelle à réussir, mais il ne fait pas que le client utilise le certificat Serialized dans config - il le fait accepter tout certificat, qui est inacceptable malheureusement: /



4
votes

Sketch Solution:

1) Définissez et enregistrez une personnalisation x509certificatevalidator sur le client

2) Dans la méthode Validate , comparez le certificat donné avec celui présent dans le client NOWPOREDRESS.IENTITITY . L'objet référencé par cette propriété doit avoir le X509CERTIFICATEDENDIENTITITY TYPE EXACT.

Je n'ai pas testé cette solution, mais cela me convient parfaitement.

hth Pedro


3 commentaires

C'est ce que j'ai fini par faire. J'ai une question si - pourquoi ne travaille-t-il pas hors de la boîte? Si le client dispose de toutes les informations requises et reçoit un certificat d'un service, c'est la chose la plus naturelle à faire pour valider l'une contre l'autre. Pourquoi ne fait pas cela?


Conjecture: Pour des raisons de sécurité. En utilisant la solution proposée, la sécurité du processus d'importation de la WSDL devient encore plus critique, car aucune vérification supplémentaire de certificat ne sera effectuée lors de la communication avec le service.


Je viens de commencer une généraliste sur ma propre question qui semble semblable à ce que vous dites ici. Si vous pouvez épeler la solution plus en détail là-bas, je l'apprécierais beaucoup! Stackoverflow.com/Questtions/4579666/...



2
votes

[Mettre à jour] en réglant CertificatValidationMode à aucun ne sera faire l'exception disparaître, c'est Solution inacceptable de la sécurité point de vue.

Cela rend le client simplement reconnaître qu'il reçoit '"certains" certificat, sans entrer dans les détails. Cette fait toute la gamme d'hommes au milieu attaques possibles. Ça ne va toujours pas valider les informations envoyées par Service (allégué) contre le certificat largué dans la configuration.

Vous avez tort. Cela fera parfaitement. C'est en fait ce que vous voulez - votre certificat à pas être validé. Tout ce dont vous avez besoin est de définir l'identité du point final sur le client sur xxx

lorsque le client se connecte au serveur WCF comparera les deux certificats et jette une exception si elles le font ne pas correspondre. Et vous êtes parfaitement sûr.

à l'aide d'un validateur personnalisé comme Pedro Felix suggéré est totalement inutile dans votre cas. C'est exactement ce que l'identité du point final est pour.


1 commentaires

Ceci est une erreur en erreur - Certing CertificatValidationMode sur Aucun signifie que vous pouvez avoir un encodévalue et cela ne sera pas vérifié.



1
votes

Ceci est un commentaire supplémentaire à ma réponse précédente. Désolé je ne peux pas commenter les réponses.

En outre, vous faites pas besoin de définir une identité sur le serveur. Oubliez ce que WSDL vous indique l'identité du serveur. L'identité d'un point d'extrémité de service à distance est décidée par le client pendant l'exécution. Si le serveur utilise SSL, il a plusieurs identités: le nom commun du certificat (c'est-à-dire une identité DNS), une identité de certificat et une identité de RSA (pas sûr de la dernière). Par conséquent, vous pouvez vérifier l'identité du serveur par quiconque de ces critères (ou par plusieurs d'entre eux).


0 commentaires

2
votes

Désolé, je ne peux pas commenter sur d'autres réponses.

Je viens de tester cela dans .NET 4.0 et je peux confirmer que la réponse "Zeratul" est correcte. Paramètres explicitement L'identité du service soit dans la configuration, soit programmatiquement suffisante pour l'authentification du serveur. Il n'est pas nécessaire de valider le certificat par aucun autre moyen (c'est-à-dire définir "CerticalValidationMode" sur "Aucun"), car vous utilisez la méthode de validation ultime - Comparaison de l'empreinte tunaire du certificat.

@Alexdrenea

"ServiceCertificate" n'est pas utilisé pour la validation. Il est utilisé avec la sécurité des messages pour chiffrer les messages avant qu'ils ne soient envoyés sur le serveur. Voir la documentation de Microsoft à ce sujet:

http://msdn.microsoft.com/en-us/library/ MS731782.aspx


0 commentaires