Question

Je crée une application WCF dans laquelle je vais utiliser des certificats pour chiffrer la communication entre le client et le serveur. Dans mon environnement de développement, je souhaite utiliser un certificat de test / certificat auto-signé que j'ai créé à l'aide de makecert. (Seul le serveur aura un certificat, pas le client).

J'ai installé le certificat dans un magasin de certificats et tout fonctionne correctement. Sur le client, certificateValidationMode est actuellement défini sur "false", car je travaille avec un certificat de test.

Mon problème:

Dans le fichier app.config sur le client, je dois spécifier l'élément d'identité comme suit:

<endpoint ... >
   <identity>
      <dns value="<Name-Of-Server-Computer>"/>
   </identity>
</endpoint>

Si je supprime l'élément identity, le message d'erreur suivant s'affiche dans le client lorsque j'essaie de me connecter au serveur:

  

Échec de la vérification de l'identité du message sortant. L'identité DNS attendue du noeud final distant était 'localhost', mais celui-ci a fourni la revendication DNS 'Nom-du-serveur-ordinateur'. S'il s'agit d'un noeud final distant légitime, vous pouvez résoudre le problème en spécifiant explicitement l'identité DNS 'Nom-du-serveur-ordinateur' en tant que propriété d'identité de EndpointAddress lors de la création du proxy de canal.

Alors voici mes questions:

  • Le contrôle d'identité est-il effectué uniquement lors de l'utilisation d'un certificat de test / auto-signé? Lorsque je déploie mon application à l'aide d'un certificat réel, approuvé, acheté auprès d'une autorité de certification, le contrôle d'identité sera-t-il toujours effectué?

  • Existe-t-il un moyen de désactiver le contrôle d'identité? Je sais que je peux créer mon propre validateur de certificat personnalisé, mais il ne semble pas y avoir de moyen de remplacer le contrôle d'identité à l'aide de ceux-ci.

Était-ce utile?

La solution

La vérification est toujours faite - et devrait l'être. Fondamentalement, WCF vérifiera que le certificat est émis pour le nom de domaine (votreentreprise.com) ou le nom de la machine sur laquelle réside votre service. Ceci est une vérification de sécurité que je ne désactiverais jamais! Sinon, toute personne usurpant votre service pourrait utiliser n'importe quel certificat destiné à un nom de domaine / ordinateur arbitraire et obtenir votre trafic, et non ce que vous voulez!

Vous devez donc vous assurer que votre vrai certificat sur le serveur de production est effectivement attribué à ce nom de domaine dont le serveur de production fera partie, par exemple. si votre serveur de production doit se trouver dans "production.votreentreprise.com", le certificat doit être libellé dans ce domaine.

Marc

Autres conseils

La réponse à cette question se trouve dans le message d'erreur même. Sur le client, vous pouvez faire:

EndpointIdentity identity = EndpointIdentity.CreateDnsIdentity("Server");
EndpointAddress address = new EndpointAddress(new Uri("net.tcp://1.2.3.4:12345/ServiceName"), identity);

Remplacez "Serveur" par ce qui est attendu. En règle générale, il s’agit du nom usuel (CN) de votre certificat auto-signé. Cela ne ruinera pas la sécurité, à condition que vous assumiez l'entière responsabilité de vous assurer que le certificat présenté est valide, c'est-à-dire que vous créez votre validateur de certificat personnalisé et effectuez les vérifications nécessaires.

certificateValidationMode doit être défini sur "Aucun", pas "faux" ...

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top