Настройка SSL-сертификата сервера (файл .p12) на сервере c # - PullRequest
1 голос
/ 16 декабря 2011

Я создаю клиент-серверное приложение для iPhone, сервер написан на c # и использует TcpListener для прослушивания входящих соединений и TcpClient для обработки каждого соединения.Код выглядит примерно так:

    private void startAcceptingConnections()
    {
        m_Listener = new TcpListener(i_IPAddress, i_Port);
        m_Listener.Start();

        while (true)
        {
            //blocking
            TcpClient tcpConnection = m_Listener.AcceptTcpClient();

            Thread ClientAuthenticationThread = new Thread(new ParameterizedThreadStart(HandleClientConnection));
            ClientAuthenticationThread.Start(tcpConnection);
        }

    }

    private void HandleClientConnection(object i_Client)
    {
        TcpClient client = i_Client as TcpClient;

        if (client != null)
        {
            NetworkStream clientStream = client.GetStream();
            byte[] buffer = new byte[4096];
            int bytesRead = 0;

            //blocking
            bytesRead = clientStream.Read(buffer, 0, 4096);
            if (bytesRead == 0)
            {
                client.Close();
            }
            else
            {
                // do something with bytesRead
            }
        }
    }

Я хочу добавить SSL в свое приложение, вот что я сделал до сих пор:

  1. В моем MacBook я создал сертификатПолномочия с помощью Keycahin
  2. Затем с помощью CA, созданного на первом этапе, я выдал сертификат SSL сервера (кажется, он называется Server Identity)
  3. Я связал CA в своем приложении для iPhone.
  4. Я экспортировал идентификатор сервера в виде файла .p12

Теперь я знаю, что мне нужно установить этот файл на моем сервере, но я не знаю как.Может кто-нибудь подсказать мне?

@@@@@ Я нашел этот код в MSDN, это все, что мне нужно добавить для поддержки SSL?

private void startAcceptingConnections()
{
    string certPath = "C:\\...Path...\\ServerCertificates.p12";
    serverCertificate = new X509Certificate(certPath, "serverCertPassword");

    m_Listener = new TcpListener(i_IPAddress, i_Port);
    m_Listener.Start();

    while (true)
    {
        //blocking
        TcpClient tcpConnection = m_Listener.AcceptTcpClient();

        Thread ClientAuthenticationThread = new Thread(new ParameterizedThreadStart(HandleClientConnection));
        ClientAuthenticationThread.Start(tcpConnection);
    }

}

private void HandleClientConnection(object i_Client)
{
    TcpClient client = i_Client as TcpClient;

    try
    {
        NetworkStream clientStream = client.GetStream();

        // A client has connected. Create the 
        // SslStream using the client's network stream.
        SslStream sslStream = new SslStream(clientStream, false);

        sslStream.AuthenticateAsServer(serverCertificate, false, SslProtocols.Tls, true);

        byte[] buffer = new byte[4096];
        int bytesRead = 0;

        //blocking
        bytesRead = clientStream.Read(buffer, 0, 4096);
        if (bytesRead == 0)
        {
            sslStream.Close();
            client.Close();
        }
        else
        {
            // do something with bytesRead
        }
    }
    catch (AuthenticationException e)
    {
        Console.WriteLine("Exception: {0}", e.Message);
        if (e.InnerException != null)
        {
            Console.WriteLine("Inner exception: {0}", e.InnerException.Message);
        }
        Console.WriteLine ("Authentication failed - closing the connection.");
        sslStream.Close();
        client.Close();
        return;
    }
}
...