2010-01-26 10 views
0

J'ai un serveur WCF déployé via IIS. Je veux créer un certificat pour cela. Je pourrais le faire en faisant du serveur un serveur de certificats.Pouvez-vous demander à un client de faire confiance à un certificat de serveur sans avoir besoin d'être un certificat de confiance enregistré?

Mais lorsque le client se connecte à ce serveur, je souhaite que le client approuve automatiquement le certificat sans devoir enregistrer ce serveur en tant qu '«autorité de confiance».

Est-ce possible?

Tout cela semble beaucoup de travail pour mettre la protection de mot de passe de nom d'utilisateur sur un service de WCF!

+0

Vous n'avez pas besoin de certificat pour l'authentification du nom d'utilisateur/mot de passe. Essayez-vous de faire une authentification de certificat mutuel ou un nom d'utilisateur par-dessus le transport? La réponse est un peu différente pour chacun. – Aaronaught

+0

dans WCF, comment faites-vous l'authentification de nom d'utilisateur/mot de passe sans certificat? –

+0

@Keith - dans WCF, vous ne pouvez pas utiliser l'authentification basique basée sur les messages, sauf si vous usurpez un comportement qui trompe WCF en lui faisant croire que le transport est sécurisé. Vous ne feriez généralement cela que si vous savez quelque chose que WCF ne fait pas (que le transport est sécurisé quand WCF ne le pense pas). –

Répondre

2

La réponse courte est non le client devra ajouter la racine du certificat du serveur en tant qu'autorité de confiance. La réponse légèrement plus longue est qu'il existe une solution pour implémenter la sécurité du transport dans WCF lors de l'utilisation de l'authentification basée sur les messages - cette solution est généralement utilisée lorsque vous souhaitez utiliser un autre mécanisme de sécurité que le serveur WCF ignore. , comme un serveur ISA fournissant SSL.

Jetez un oeil à Yaron Naveh's post. L'idée essentielle est que vous créez une liaison de transport qui prétend qu'elle est sécurisée.

Avec tout cela, vous avez toujours besoin de sécurité (vous ne voulez pas envoyer vos creds en clair) et aurez donc besoin d'une chaîne de confiance pour votre cert. Donc, cela ne peut pas vraiment vous aider, mais j'espère que cela vous donne quelques options à considérer.

Modifier

Désolé si ma réponse était trompeuse. Le certificat racine du certificat de serveur doit être dans le magasin de confiance du client. Mon détail supplémentaire donnait une autre option pour fournir la sécurité (vous pouvez utiliser un serveur ISA avec un certificat de confiance pour donner votre connexion SSL)

Dans une situation similaire à la vôtre (nécessitant une communication sécurisée lorsque vous envoyez des applications client à des clients non techniques) J'ai installé par programme les certs de racine nécessaires.

Voici un SO après qui détaille comment faire: How can I install a certificate into the local machine store programmatically using c#?

+0

ok, donc je peux automatiquement Acceptez le CERT du côté client? fondamentalement, je ne veux pas que le programme client doit faire quelque chose de spécial autre que de remplir leur nom d'utilisateur/mot de passe –

+0

@Keith Non - désolé si ma réponse était trompeuse. Vous aurez besoin de votre client pour avoir la racine de votre chaîne de confiance de certificats dans le magasin. J'ai posté un lien vers un post SO détaillant comment installer les certificats par programme. –

1

Eh bien, s'il y aurait une telle manière, ce serait un trou de sécurité.

Si un certificat n'est pas lié à une autorité de confiance, il est facilement contrefait. Vous pouvez donc soit lier d'une manière ou d'une autre (directement ou par l'intermédiaire d'un certificat parent que vous contrôlez), soit configurer votre client pour qu'il ne nécessite pas le certificat, c'est-à-dire utiliser http plutôt que https.

Il suffit de garder à l'esprit qu'il laisse vos clients ouverts à une variété d'attaques

Modifier

L'un des scénarios possibles d'attaque est un homme dans l'attaque moyenne - un programme s'insère entre votre service et le client et canalise l'information si elle-même. De cette façon, l'intrus a un contrôle complet sur le flux d'informations.

Il peut faire des copies de mots de passe ou il peut "ajuster" les résultats dans les deux sens comme il veut. La seule chose qui empêche cela est les certificats.Mais s'ils ne sont pas enracinés, ils peuvent être forgés.

+0

Avec un service WCF, l'authentification basée sur les messages via http n'est pas possible sans utiliser une solution de contournement comme je l'ai mentionné. Et comme vous le dites, employer une telle solution est généralement une mauvaise idée à moins que l'on sache ce que l'on est en train de faire. –

+0

Je ne vois pas comment il y a un gros trou de sécurité .... Je veux que les clients puissent se connecter, ils doivent encore envoyer un mot de passe et un nom d'utilisateur. En WCF vous ne pouvez pas faire cela à moins que ce soit sur une connexion cryptée ... d'où la nécessité de certificats entiers .... essentiellement je me fiche que l'hôte a un client valide ou le client est connecté à l'hôte de droite .. Je pense que c'est principalement un homme dans le système de protection du milieu. –

1

Vous pouvez si vous ajoutez ceci à votre code mais soyez conscient de ce que vous faites!

System.Net.ServicePointManager.ServerCertificateValidationCallback += (se, cert, chain, sslerror) => { return true; }; 
Questions connexes