3


私は奇妙な問題を抱えています..net 2 SslStreamを介してチャットしている.net2に基づいてc#でサーバーとクライアントを書きました。Cl と S の間でコマンドを送信するための接続が 1 つあり、cl と s の間でファイルを送信するための接続が 1 つあります。
ローカルでは、すべてが私の Windows マシンで正常に動作しています。しかし、Linux サーバー (mono を使用) でサーバーを実行すると、特定の状況でファイルの共有が機能しません。ファイルにはさまざまなカテゴリがあり、3 つのうち 2 つが機能しており、3 つ目はサーバーがハングアップしSSLStream.AuthenticateAsServer(....);、クライアントが「SSPI への呼び出しに失敗しました。内部例外を参照してください」というメッセージで例外をスローします。innerexception は System.ComponentModel.Win32Exception で、「受信したメッセージは予期しないものであるか、形式が正しくありません。」というメッセージが表示されます。

Linuxで実行する方法が間違っている可能性があると思います。実際、私はローカル開発にVS2012を使用しており、サーバーに配置したい場合は、VSでコンパイルされたexeをアップロードし、それを使用mono server.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

            }

        }
    }
4

2 に答える 2

7

さて、私はinnerExceptionについてもう少し深く調査し、ここで解決策を見つけました:

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

クレジットはMSDNのpaksysに送られます

問題はクライアントにあり、私は変更しました

Stream.AuthenticateAsClient(hostname);

X509Certificates.X509Certificate2Collection xc = new X509Certificates.X509Certificate2Collection();
Stream.AuthenticateAsClient(hostname, xc, Security.Authentication.SslProtocols.Tls, false);
于 2012-10-29T14:55:53.167 に答える