2009-07-05 75 views
1

我想編碼使用.NET的tcpip服務器。看看這個網站上的線程,一般的共識似乎是使用.NET 3.5 SocketArgs類的一些變體來最大程度地擴展 但是我也必須使用SSL,唯一的方法就是使用tcplistener,然後從Begin \ End Accept方法中獲取一個tcpclient,然後獲取底層網絡流,並使用beginauthasserver 對該流進行分層。然後使用該流執行BeginRead \ Write以與客戶端進行通信Tcpip監聽套接字SSL流非常混亂

I猜我的問題是這樣的

是我對上面的理解正確在如何做tcpip對SS1使用.NET

因爲大家都說使用socketeventargs類,我不認爲我可以支付多少罰款,這只是安全通道的價格。

我使用WCF,如果是這樣的話,我的.NET 2.0客戶端選項是什麼(我們的產品在桌面上不需要3.5)。換句話說,我是否可以使用.NET 2.0 TcpCLient類與3.5 WCF tcp服務器進行通信

回答

4

一旦你有一個連接的套接字,它不是一個非常複雜的設置讓SSL在套接字上工作。首先,您需要使用以Socket爲參數的構造函數來分配NetworkStream對象。然後,我使用構造函數創建了一個SslStream對象(NetworkStream,bool,RemoteCertificateValidationCallback)。然後,您需要調用AuthenticateAsServer或AuthenticateAsClient。這裏有一個例子:

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 
} 

然後,我只是用了返回的SslStream盡我的正常通信。一旦你有一個.CER文件,服務器的一半代碼就不那麼複雜了。用下面的2行替換AuthenticateAsClient電話:

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

工作開始它不是SSL頻道?它看起來像套接字上面的示例(我假設存在,因爲客戶端調用連接到服務器)實際上不是SSL,然後以某種方式成爲SSL通道。 我在這裏丟失了什麼 – Rahul 2009-07-09 00:37:03

-1

當然,您必須在此切換到Web服務或.net遠程處理(均適用於2.0)。有關於通過SSL進行遠程處理的各種資源,e.g

+0

我不認爲我有「一定」切換到任何東西:-) 不過是遠程這樣做,當客戶端連接到服務器通過SSL – Rahul 2009-09-11 08:22:05