Utiliser SSL et SslStream pour l'authentification entre homologues?
J'ai besoin pour assurer la sécurité de la communication entre les différents processus qui sont à l'aide de sockets TCP/IP pour la communication. Je veux à la fois l'authentification et le chiffrement. Plutôt que de réinventer la roue, je voudrais vraiment utiliser SSL et le SslStream de classe et des certificats auto-signés. Ce que je veux faire est de valider le processus distant certificat d'une copie connue dans mon application locale. (Il n'a pas besoin d'être une autorité de certification, car j'ai l'intention de certificats d'être copié autour manuellement).
Pour ce faire, je veux de l'application pour être en mesure de générer automatiquement un nouveau certifiate la première fois qu'il est exécuté. En plus makecert.exe il ressemble ce lien montre un moyen de générer automatiquement des certificats auto-signés, donc c'est un début.
J'ai regardé le AuthenticateAsServer et AuthenticateAsClient méthodes de SslStream. Vous pouvez fournir des rappels à des fins de vérification, de sorte qu'il ressemble c'est possible. Mais maintenant que je suis dans les détails, je ne pense vraiment pas qu'il soit possible de le faire.
Vais-je dans la bonne direction? Est-il une meilleure alternative? Quelqu'un a fait quelque chose comme ça avant (en gros peer-to-peer SSL plutôt que sur le client-serveur)?
source d'informationauteur Scott Whitlock
Vous devez vous connecter pour publier un commentaire.
Étape 1: Générer un certificat auto-signé:
J'ai utilisé ce code pour générer un .pfx fichier de certificat:
Étape 2: Chargement du certificat
Étape 3: de les Mettre ensemble
J'ai remplacé cette ligne dans le Programme Serveur.cs fichier avec la ligne à partir de l'Étape 2:
X509Certificate cert = getServerCert();
Dans le Programme Client.cs fichier, assurez-vous de définir serverName = yourhostname.com (et qu'il correspond au nom dans le certificat)
Étape 4: L'Authentification Du Client
Voici comment mon client s'authentifie (c'est un peu différent de celui du serveur):
La CertificateValidationCallback est le même que dans le cas de serveur, mais notez comment AuthenticateAsClient prend une collection de certificats, et pas seulement un seul certificat. Donc, vous devez ajouter un LocalCertificateSelectionCallback, comme ceci (dans ce cas, je n'ai qu'un seul client cert donc, je viens de renvoyer le premier de la collection):
vous pouvez regarder de trop cet exemple
Asynchrone Exemple SslStream Client/Serveur De Mise En Œuvre
http://blogs.msdn.com/joncole/archive/2007/06/13/sample-asynchronous-sslstream-client-server-implementation.aspx
si le certificat n'est pas produit correctement, vous pouvez obtenir de l'exception Le mode de serveur SSL doit utiliser un certificat avec la clé privée associée.
certificat de base exemple
makecert -sr LocalMachine ss-Ma -n CN=Test -ciel de change -sk 123456
ou
en tant que fichier externe
makecert -sr LocalMachine ss-Ma -n CN=Test -ciel de change -sk 123456 c:\Test.cer
Outil De Création De Certificat Makecert.exe)
http://msdn.microsoft.com/en-us/library/bfsktky3%28VS.80%29.aspx
Ce que vous proposez sonne bien pour moi, sauf qu'il semble que vous êtes à la recherche d'attendre jusqu'à ce que le callback n'est appelé, afin de générer le certificat. Je ne pense pas que voler; autant que je sache, vous devez fournir un certificat valide lorsque vous appelez
AuthenticateAsX
.Toutefois, ces classes sont substituables; donc, en théorie, vous pouvez créer une classe dérivée qui vérifie d'abord si un certificat doit être générée, génère si besoin est, puis invoque le parent
AuthenticateAsX
méthode.