Laden...
S
steveoh444 myCSharp.de - Member
Schüler Deutschland Dabei seit 06.04.2011 9 Beiträge
Benutzerbeschreibung

Forenbeiträge von steveoh444 Ingesamt 9 Beiträge

07.04.2011 - 20:35 Uhr

Japs hab ich "self signet SSL Certificate" oder wie sich das schimpft -.- man da muss es doch was geben was mir weiterhilft 😄

07.04.2011 - 00:19 Uhr

Super 😃 bin echt erleichtert 😃..

nur leider gibts wieder n neues problem 😄 ... entwikelt sich glaub ich zu ner never ending storry 😄 ...

EDIT:
iwas mit der Athentifizierung nicht -.-

Das Property "sslStream.SslProtocoll" sagt: "Servermodus-SSL muss ein Zertifikat mit dem verknüpften privaten Schlüssel verwenden."

& "IsAuthentificated" is auch immer false -.-

EDIT2:

Mein Connect auf der Client seite sieht atm so aus:

private void btnConnect_Click(object sender, EventArgs e)
        {
            string machineName = "localhost";
            string serverName = "MyTestCert2";
            btnConnect.Enabled = false;
            tcpClient = new TcpClient(machineName, 10009);
            //tcpClient.Connect("127.0.0.1", 10009);
            sslStream = new SslStream(
               tcpClient.GetStream(), false,
               new RemoteCertificateValidationCallback(CertificateValidationCallback), null);
            try
            {
                sslStream.BeginAuthenticateAsClient(serverName, data =>
                {
                    netRead = new Thread(NetworkReader);
                    netRead.Start();
                }, null);
            }
            catch (AuthenticationException ex)
            {
                Console.WriteLine("Exception: {0}", ex.Message);
                if (ex.InnerException != null)
                {
                    Console.WriteLine("Inner exception: {0}", ex.InnerException.Message);
                }
                Console.WriteLine("Authentication failed - closing the connection.");
                tcpClient.Close();
                return;
            }
        }
06.04.2011 - 14:29 Uhr

Da Du deinen Server Code jetzt aber bestimmt geändert hast, kann man nicht genau sagen wo es hängt..

Ich habe Ihn dahingehend geändert das ich auf in der Serverklasse "Clients" die Eigenschaft des TCPClients verändert habe:


public TcpClient TcpClient
        {
            get { return tcpClient; }
            set 
            { 
                tcpClient = value;
                sslStream = new SslStream(tcpClient.GetStream(), false);
                //sslStream.AuthenticateAsServer(, false, SslProtocols.Default, true);
                sslStream.BeginAuthenticateAsServer(new X509Certificate(@"C:\MyAppTestCert.cer",""),data =>
                    {
                        clientThread = new Thread(Run);
                        clientThread.Start();
                    },null);

            }
        }

BTW das mit dem data => .... habe ich vorher noch nie gesehn ?! hat das n bestimmten namen ?! Ist das soetwas wie eine "Anonyme" Methode ?

Und noch ne Frage Brenötige ich ein spezielles "SSL" Zertifikat oder geht das auch mit dem wie in (CodeIdol) beschriebenen Zertifikat?

EDIT: Ich habe hier auch nochmal die Solution mit angehängt ... vllt fällt ja jem ein was ich noch machen muss damit es endlich funktioniert -.-'

06.04.2011 - 12:28 Uhr

Okay auf der Clientseite läuft das jezt nur auf der serverseite bricht der genau bei

                sslStream.AuthenticateAsServer(new X509Certificate(@"C:\MyAppTestCert.cer",""), false, SslProtocols.Default, true);

ab -.-

sollte man da auch mit einer asynchronen Authentifizierung arbeiten ?

EDIT:

Alles okay jez sperrt der nix mehr 😃 super

Neuer fehler:


public void WriteMessage(string message)
        {
            byte[] myWriteBuffer = new byte[1024];
            myWriteBuffer = StringToByteArray(message);
            sslStream.Write(myWriteBuffer, 0, myWriteBuffer.Length);
        }

Fehlermeldung:
System.InvalidOperationException wurde nicht behandelt. Dieser Vorgang ist nur unter Verwendung eines erfolgreich authentifizierten Kontexts zulässig.

EDIT2:

Gibts iwie ne mehtode abzufragen ob jez authentifiziert wurde ?

06.04.2011 - 03:12 Uhr

Also kurz meine Meinung.
Eine gute Gui definiert sich nicht durch die Icons.
Bücher zum GUI Design gibts aber einige 😃

Dem kann ich nur zustimmen!
Eigendlich steht die Userbility immer im vordergrund eines Programms. Das Programm kann noch so toll aussehn oder auch überladen sein mit icons , es nützt nur nichts wenn ein user damit nicht zurecht kommt. Kurze bündige setze etc , etc...

06.04.2011 - 03:05 Uhr

Darf man frage wozu du das genau brauchst ?

06.04.2011 - 02:54 Uhr

@RaphaelH

Ich baue gerade eine ähnliche anwendung in C#. Bzw habe ich sie bereits fertig. einen MulticlientServer der MySQL befehle vom Client umsetzen soll etc. Ich Arbeite dabei mit dem Networkstream, TCPListener und TCPClient. Das ging eig ziemlich leicht 😃 ...

Wenn du magst kann ich dir mein Projekt gern mal per mail icq etc schicken .. wollte das jez nich so publishen 😄.

Btw: versuche ich gerade auch gerade das ganze umzubauen nach SSL , was sich als schwieriger herausgestelt hat als es klingt. ( siehe mein aktueller Thread).

Mfg

steveoh444

06.04.2011 - 02:42 Uhr

Guten Tag Community 😃
Ich Habe vor ein paar Wochen angefangen mit C# Netzwerkprogrammierung zu betreiben. Mein erstes Projekt war ein Multiclientserver mittels des TCPListener und TCPClients und des Networkstreams. Das hat alles wunderbar funktioniert. Jetzt wollte ich das Ganze etwas aufpeppen und mit SSL versehen und habe mir dazu den msdn eintrag SSL-MSDN und zwei weitere Artikel (Artikel 1 (Artikel 2) durchgelesen und meine auch diese verstanden zu haben.Mein Fehler ist während der Client Authentifizierung. Das Programm macht garnichts mehr es schmeißt keine Exception oder so.Ich Poste aber erstes mal meine komplette Solution damit Ihr euch erstmal einen Überblick verschaffen könnt.(Welche auch als Anhang beiliegt).

SERVER: Main Klasse


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Net.Security;
using System.Security.Authentication;
using System.Threading;
using System.Collections;
using Microsoft.VisualBasic;
using System.Security.Cryptography.X509Certificates;

namespace MultiClientServer
{
    public partial class frmServer : Form
    {
        public frmServer()
        {
            InitializeComponent();
        }
        ClientList clList;
        //List für alle verbindungen
        List<Clients> clients = new List<Clients>();
        internal List<Clients> Clients
        {
            get { return clients; }
            set { clients = value; }
        }
        //Port
        public int serverListenPort = 10009;
        //Diese IP
        IPAddress ipAddress = IPAddress.Any;
        //Zeit die gewarted wird bis eine neue Verbindung angenommen wird
        int sleepTime = 200;
        //Main-Thread
        private Thread mainThread;


        private void frmMain_Load(object sender, EventArgs e)
        {
            mainThread = new Thread(mainListener);
            mainThread.Start();
        }
        

        private void mainListener()
        {
            // Alle Netzwerk-Schnittstellen abhören
            TcpListener listener = new TcpListener(ipAddress, serverListenPort);
            rtbLog.Invoke((MethodInvoker)delegate { rtbLog.Text += "Listening on port " + serverListenPort + "..." + Environment.NewLine; });
            try
            {
                listener.Start();
                while (true)
                {
                    while (!listener.Pending()) { Thread.Sleep(sleepTime); }
                    Socket newSocket = listener.AcceptSocket();
                    TcpClient tcpClient = listener.AcceptTcpClient();
                    if (tcpClient != null)
                    {
                        // Mitteilung bzgl. neuer Clientverbindung
                        rtbLog.Invoke((MethodInvoker)delegate
                        {
                            rtbLog.Text += "Neue Client-Verbindung (IP: " + newSocket.RemoteEndPoint + ", Port " + ((IPEndPoint)newSocket.LocalEndPoint).Port.ToString() + ")" + Environment.NewLine;
                        });
                        Clients client = new Clients(this, clients.Count);
                        client.Socket = newSocket;
                        client.TcpClient = tcpClient;
                        clients.Add(client);
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                MessageBox.Show("Server wird Beendet");
            }
            catch (Exception ex)
            {
                // throw new Exception("Fehler bei Verbindungserkennung", ex);
            }
        }


        private void frmServer_FormClosing(object sender, FormClosingEventArgs e)
        {
            while (mainThread.IsAlive && mainThread != null)
            {
                mainThread.Interrupt();
                mainThread.Abort();
            }
            KickAllClients();
        }
        private void KickAllClients()
        {
            if (clients.Count > 0)
            {
                try
                {
                    rtbLog.Text += "Beende Alle Verbindungen" + Environment.NewLine;
                    foreach (Clients client in clients)
                    {
                        client.Close("Kicked: ");
                    }
                    clients.Clear();
                    RefillClientList();
                }
                catch (InvalidOperationException)
                { }
            }
        }

        private void KickClientById(int KickId)
        {
            foreach (Clients client in clients)
            {
                if (client.ClientNummer == KickId)
                {
                    client.Close("Kicked: ");
                    //clients.Remove(client);
                    // streams.Remove(streams[KickId]);
                    return;
                }
            }
        }

        public void RemoveClient(int clientId)
        {
            foreach (Clients client in clients)
            {
                if (client.ClientNummer == clientId)
                {
                    clients.Remove(client);
                    RefillClientList();
                    return;
                }
            }
        }

        private void btnKickAll_Click(object sender, EventArgs e)
        {
            KickAllClients();
        }

        private void btnKick_Click(object sender, EventArgs e)
        {
            if (Information.IsNumeric(tbKickId.Text) && Convert.ToInt32(tbKickId.Text) <= clients.Count - 1)
            {
                KickClientById(Convert.ToInt32(tbKickId.Text));
            }
        }
        private void RefillClientList()
        {
            if (clList != null)
            {
                clList.ReFillDgv();
            }
        }

        private void btnListClients_Click(object sender, EventArgs e)
        {
            clList = new ClientList(this);
            clList.Show();
        }
    }
}


SERVER: Clients Klasse


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;
using MySql.Data.MySqlClient;
using System.Net.Security;
using System.Security;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;

namespace MultiClientServer
{
    class Clients
    {
        Thread clientThread;
        private Socket socket;
        
        public Socket Socket
        {
            get { return socket; }
            set { socket = value; }
        }

        private bool isConnected;

        public bool IsConnected
        {
            get { return isConnected; }
            set { isConnected = value; }
        }


        private int clientNummer;

        public int ClientNummer
        {
            get { return clientNummer; }
            set { clientNummer = value; }
        }

        SslStream sslStream;
        TcpClient tcpClient;

        public TcpClient TcpClient
        {
            get { return tcpClient; }
            set 
            { 
                tcpClient = value;
                sslStream = new SslStream(tcpClient.GetStream(), false);
                sslStream.AuthenticateAsServer(new X509Certificate(@"C:\MyAppTestCert.cer",""), false, SslProtocols.Default, true);

            }
        }

        private static X509Certificate GetServerCert(string subjectName)
        {
            X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
            store.Open(OpenFlags.ReadOnly);
            X509CertificateCollection certificate =
                    store.Certificates.Find(X509FindType.FindBySubjectName,
                                            subjectName, true);

            if (certificate.Count > 0)
                return (certificate[0]);
            else
                return (null);
        }

        public SslStream SslStream
        {
            get { return sslStream; }
            set 
            {
                sslStream = value;

            }
        }
        frmServer frmserver;
        public Clients(frmServer frmserver, int clientNummer)
        {
            this.clientNummer = clientNummer;
            this.frmserver = frmserver;
            clientThread = new Thread(Run);
            clientThread.Start();
        }
        public void Run()
        {
            isConnected = true;
            WriteMessage("ClientID;" + clientNummer.ToString());
            Thread netRead = new Thread(NetworkReader);
            netRead.Start();
        }
        private void NetworkReader()
        {
            while (isConnected)
            {

                try
                {
                    byte[] myReadBuffer = new byte[1024];
                    StringBuilder myCompleteMessage = new StringBuilder();
                    int numberOfBytesRead = 0;
                    string message = null;
                    numberOfBytesRead = sslStream.Read(myReadBuffer, 0, myReadBuffer.Length);
                    myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));
                    message = myCompleteMessage.ToString();
                    if (message != "")
                    {
                        if (message == "quit")
                        {
                            Close("Client quit");
                        }
                        if (message.Split(';')[0] == "dosql")
                        {
                            DoMySql(message.Split(';')[1]);
                        }
                    }

                }
                catch (ObjectDisposedException)
                { isConnected = false; }
                catch (NullReferenceException)
                { }
                catch (Exception)
                { }
            }
        }
        private void DoMySql(string querry)
        {
            MySql mysql = new MySql();
            mysql.openMysqlCon("127.0.0.1", "test", "steve", "musterPW1");
            mysql.DoSqlQuerry(querry);
            mysql.closeMysqlCon();
        }
        private byte[] StringToByteArray(string str)
        {
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
            return enc.GetBytes(str);
        }
        public void WriteMessage(string message)
        {
            try
            {
                byte[] myWriteBuffer = new byte[1024];
                myWriteBuffer = StringToByteArray(message);
                sslStream.Write(myWriteBuffer, 0, myWriteBuffer.Length);
            }
            catch (Exception)
            { }
        }
        public void Close(string closeMessage)
        {
            WriteMessage("quit" + ";" + closeMessage);
            sslStream.Close();
            isConnected = false;
            frmserver.Invoke((MethodInvoker)delegate
            {
                try
                {
                    frmserver.rtbLog.Text += closeMessage + ": (IP: " + socket.RemoteEndPoint + ", Port " + ((IPEndPoint)socket.LocalEndPoint).Port.ToString() + ")" + Environment.NewLine;
                }
                catch (Exception)
                { }
            });
            socket = null;
            while (clientThread != null && clientThread.IsAlive)
            {
                clientThread.Interrupt();
                clientThread.Abort();
            }
            frmserver.Invoke((MethodInvoker)delegate { frmserver.RemoveClient(this.clientNummer); });

        }
    }
}


Und Jetzt der Client
Client: Main Klasse


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
using System.Security.Authentication;
using System.Security;
using System.Security.Permissions;
using System.Threading;
using System.IO;

namespace Client
{
    public partial class frmClient : Form
    {
        public frmClient()
        {
            InitializeComponent();
        }
        TcpClient tcpClient;
        SslStream sslStream;
        Thread netRead;
        private bool CertificateValidationCallback(object sender,X509Certificate certificate,X509Chain chain,SslPolicyErrors sslPolicyErrors)
        {
            if (sslPolicyErrors == SslPolicyErrors.None)
            {
                return true;
            }
            else
            {
                if (sslPolicyErrors == SslPolicyErrors.RemoteCertificateChainErrors)
                {
                    Console.WriteLine("The X509Chain.ChainStatus returned an array " +
                       "of X509ChainStatus objects containing error information.");
                }
                else if (sslPolicyErrors ==
                         SslPolicyErrors.RemoteCertificateNameMismatch)
                {
                    Console.WriteLine("There was a mismatch of the name " +
                      "on a certificate.");
                }
                else if (sslPolicyErrors ==
                         SslPolicyErrors.RemoteCertificateNotAvailable)
                {
                    Console.WriteLine("No certificate was available.");
                }
                else
                {
                    Console.WriteLine("SSL Certificate Validation Error!");
                }
            }

            Console.WriteLine(Environment.NewLine +
                              "SSL Certificate Validation Error!");
            Console.WriteLine(sslPolicyErrors.ToString());

            return false;
        }

        private int clientId;

        public int ClientId
        {
            get { return clientId; }
            set { clientId = value; }
        }

        private bool connected = false;

        public bool Connected
        {
            get { return connected; }
            set { connected = value; }
        }

        private void frmMain_Load(object sender, EventArgs e)
        {

        }

        private void NetworkReader()
        {
            while (true)
            {
                try
                {
                    byte[] myReadBuffer = new byte[1024];
                    StringBuilder myCompleteMessage = new StringBuilder();
                    int numberOfBytesRead = 0;
                    string message = null;

                    numberOfBytesRead = sslStream.Read(myReadBuffer, 0, myReadBuffer.Length);

                    myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));


                    message = myCompleteMessage.ToString();
                    if (message != "")
                    {
                        if (message.Split(';')[0] == "quit")
                        {
                            //MessageBox.Show("Dissconnected: " + message.Split(';')[1]);
                            connected = false;
                            tcpClient = null;
                            sslStream = null;
                            btnConnect.Invoke((MethodInvoker)delegate { btnConnect.Enabled = true; });
                        }
                        if (message.Split(';')[0] == "ClientID")
                        {
                            clientId = Convert.ToInt32(message.Split(';')[1]);
                            connected = true;
                        }
                    }

                }
                catch (Exception)
                { }
            }
        }

        private byte[] StringToByteArray(string str)
        {
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
            return enc.GetBytes(str);
        }

        public void WriteMessage(string message)
        {
            byte[] myWriteBuffer = new byte[1024];
            myWriteBuffer = StringToByteArray(message);
            sslStream.Write(myWriteBuffer, 0, myWriteBuffer.Length);
        }

        private void bentSenden_Click(object sender, EventArgs e)
        {
            WriteMessage(tbMessage.Text);
        }

        private void btnConnect_Click(object sender, EventArgs e)
        {
            string machineName = "localhost";
            string serverName = "MyTestCert2";
            TcpClient client = new TcpClient(machineName, 10009);
            btnConnect.Enabled = false;
            tcpClient = new TcpClient();
            tcpClient.Connect("127.0.0.1", 10009);
            sslStream = new SslStream(
               client.GetStream(), false,
               new RemoteCertificateValidationCallback(CertificateValidationCallback), null);

            try
            {
                sslStream.AuthenticateAsClient(serverName);
            }
            catch (AuthenticationException ex)
            {
                Console.WriteLine("Exception: {0}", ex.Message);
                if (ex.InnerException != null)
                {
                    Console.WriteLine("Inner exception: {0}", ex.InnerException.Message);
                }
                Console.WriteLine("Authentication failed - closing the connection.");
                tcpClient.Close();
                return;
            }


            netRead = new Thread(NetworkReader);
            netRead.Start();

        }

        private void frmClient_FormClosing(object sender, FormClosingEventArgs e)
        {
            //Abmelden
            if (connected)
            {
                WriteMessage("quit");
            }
            //Warten bis Antwort kommt
            do
            { } while (connected);

            if (netRead != null && netRead.IsAlive)
            {
                netRead.Interrupt();
                netRead.Abort();
            }
        }

        private void btnDoSql_Click(object sender, EventArgs e)
        {
            if (tbSql.Text != "")
            {
                WriteMessage("dosql;" + tbSql.Text);
            }
        }

    }
}


Ich weiß absolut nicht mehr weiter und hoffe hier auf baldige hilfe

Mit freundlichen Grüßen

steveoh444