2012-10-29 56 views
1


我有一個奇怪的問題:我寫了一個基於.net2的服務器和客戶端,它們正在通過.net 2 SslStream聊天。有1個連接用於在Cl和S之間發送命令,以及一個用於在cl和s之間發送文件的連接。
本地所有在我的Windows機器上工作正常。但是,如果我在我的Linux服務器上運行服務器(使用單聲道),共享文件在某些​​情況下不起作用。我有不同的文件類別,第3箇中的2個工作,第3箇中的服務器掛在SSLStream.AuthenticateAsServer(....);上,並且客戶端拋出異常,並顯示消息「對SSPI調用失敗,請參閱內部異常」。 Innerexception是一個System.ComponentModel.Win32Exception異常與消息「收到的消息是意外或格式不正確。」SSLStream:「調用SSPI失敗」異常

我認爲我在Linux上運行它的方式可能是錯誤的。其實我使用VS2012進行本地開發,當我想把它放在服務器上時,我使用mono server.exe上傳VS和Im編譯的exe來啓動它。但我也嘗試在Windows上使用monodevelop來編譯它(從monodevelop編譯的東西也可以在本地工作)並在Linux服務器上使用它,但是這會以相同的結果結束。

任何幫助將不勝感激。



我的繼承人縮短代碼:

客戶:

//gets auth guid before, then it does 
Thread Thre = new Thread(sendfile); 
Thre.Start(authguid); 


private void sendfile(string guid){ 
TcpClient cl = new TcpClient(); 
cl.Connect(hostname, 8789); 
SslStream Stream = new SslStream(cl.GetStream(), true, new RemoteCertificateValidationCallback(ServerConnector.ValidateServerCertificate)); 
Stream.AuthenticateAsClient(hostname);//throws the exception 
//sends auth guid and file 

} 

服務器:

public class FServer 
    { 

     protected static bool halt = false; 
     protected List<FConnection> connections; 
     private TcpListener tcpServer; 
     private IPEndPoint ipEnde = new IPEndPoint(IPAddress.Any, 8789); 
     private delegate void dlgAccept(); 
     private dlgAccept accepting; 
     private IAsyncResult resAccept; 

     public FServer() 
     { 
      tcpServer = new TcpListener(ipEnde); 
      connections = new List<FConnection>(); 
      tcpServer.Start(); 
      accepting = new dlgAccept(accept); 
      resAccept = accepting.BeginInvoke(null, null); 


     } 

     public void accept() 
     { 
      do 
      { 
       if (tcpServer.Pending()) 
        connections.Add(new FConnection(tcpServer.AcceptTcpClient(), this)); 

       else 
        Thread.Sleep(750); 
      } while (!halt && tcpServer != null); 
     } 

     public class FConnection 
     { 
      public SslStream stream; 
      //.....some other properties 

      public static bool ValidateClientCertificate (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
      { 
       return true; 

      } 

      public FConnection(TcpClient cl, FServer inst) 
      { 
       instance = inst; 
       client = cl; 

        stream = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateClientCertificate), null); 
        stream.AuthenticateAsServer(instance.mainserver.serverCert, false, SslProtocols.Tls, false);//hangs sometimes on this 
        if (stream.IsAuthenticated && stream.IsEncrypted) 
        { 
        } 
        else 
        { 
         this.Dispose(); 
        } 

        //auth and receiving file 

      } 

     } 
    } 

回答

5

好吧,我研究有關的InnerException深一點,在這裏找到了解決辦法:

http://social.msdn.microsoft.com/forums/en-US/netfxnetcom/thread/18b4a0ce-b348-403d-8655-fe9d558f8d6b

的榮譽屬於paksys從MSDN

的問題是在客戶端和我改變

Stream.AuthenticateAsClient(hostname); 

X509Certificates.X509Certificate2Collection xc = new X509Certificates.X509Certificate2Collection(); 
Stream.AuthenticateAsClient(hostname, xc, Security.Authentication.SslProtocols.Tls, false); 
+0

爲什麼同樣的方法不爲我工作?即使上面提到的變化發生,我也會得到同樣的錯誤。 –

+0

有人幫我嗎? –

+0

嗨。我也有同樣的問題。即使你改變了這個問題也沒有修復。不知道有更多的信息? – virtouso

1

我只是有相同問題和接受的答案不適合我。問題在於服務器證書使用SHA-2。下面是我用它來修復它的代碼:

X509Certificates.X509Certificate2Collection xc = new X509Certificates.X509Certificate2Collection(); 
Stream.AuthenticateAsClient(hostname, xc, Security.Authentication.SslProtocols.Tls12, false); 
  • 注意與接受的答案,唯一的區別是sslProtocol

希望它可以幫助別人

相關問題