2009-07-05 8 views
1

Je suis en train de coder un serveur tcpip en utilisant. NET. En regardant les discussions sur ce site, le consensus général semble être d'utiliser une certaine variation des classes .NET 3.5 SocketArgs pour être au maximum évolutif. Mais je dois également utiliser SSL, et la seule façon de le faire semble être d'utiliser un fichier .NET 3.5. TcpListener puis prendre un tcpclient du Begin \ End Accepter la méthode et obtenir le flux de réseau sous-jacent et la couche du flux SSl sur l'aide de la beginauthasserver ensuite, utilisez ce flux pour faire BeginRead \ write pour communiquer avec le clientTcpip écouteurs sockets flux SSL tellement de confusion

I suppose que mes questions sont um

est ma compréhension rectiffent en termes de la façon de faire TCPIP sur .NET en utilisant SSl

puisque tout le monde dit utiliser la classe socketeventargs et je ne pense pas que je peux combien de pénalité vais-je payer, Est-ce juste le prix pour le canal sécurisé. Shoud J'utilise WCF et si oui quelles sont mes options avec un client .NET 2.0 (notre produit ne peut pas exiger 3.5 sur le bureau). En d'autres termes, puis-je utiliser une classe .NET 2.0 TcpCLient pour parler à un serveur WCF 3.5 WCF

Répondre

4

Une fois que vous avez un socket connecté, ce n'est pas une configuration très compliquée pour que SSL fonctionne sur le socket. D'abord, vous devrez allouer un objet NetworkStream en utilisant le constructeur qui prend le Socket comme paramètre. Ensuite, j'ai créé un objet SslStream en utilisant le constructeur qui prend (NetworkStream, bool, RemoteCertificateValidationCallback). Ensuite, vous devez appeler AuthenticateAsServer ou AuthenticateAsClient. Voici un exemple:

private SslStream WrapSocket(Socket socket) 
{ 
    var myNetworkStream = new NetworkStream(socket); 
    var mySslStream = new SslStream(myNetworkStream, false, OnCertificateValidation); 
    mySslStream.AuthenticateAsClient(String.Empty); 
} 

private static bool OnCertificateValidation (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
{ 
    return true; // NOT RECOMMENDED FOR PRODUCTION CODE 
} 

Alors je fais juste de ma communication normale en utilisant la SslStream qui a été retourné. La moitié du code du serveur n'est pas beaucoup plus compliquée une fois que vous avez déjà un fichier .CER. Remplacer l'appel AuthenticateAsClient avec les 2 lignes suivantes:

var certificate = X509Certificate.CreateFromCertFile("my.cer"); 
mySslStream.AuthenticateAsServer(certificate); 
+0

donc quand le client se connecte au serveur d'abord ce n'est pas un canal SSL? il semble que dans l'exemple au-dessus de la socket (que je suppose en existence parce qu'un client appelle se connecter à un serveur) est intially pas SSL, puis devient un canal SSL en quelque sorte. Ai-je manqué quelque chose ici – Rahul

+0

Correct, lorsque la connexion TCP démarre, il s'agit d'une connexion TCP standard. Envelopper le SslStream sur le NetworkStream du socket puis initie la connexion sécurisée. Vous leur envoyez tout votre trafic en utilisant les méthodes Send et Receive de SslStream. – scwagner

-1

Vous devez absolument passer aux services Web ou .net remoting ici (les deux fonctionnent sur 2.0). Il existe diverses ressources concernant l'accès distant sur SSL, e.g.

+0

je ne facturons pense que je dois « certainement » passer à quelque chose :-) mais oui Remoting fonctionne sur SSl – Rahul