C # SSL безопасные сокеты - PullRequest
3 голосов
/ 23 июня 2011

У меня отлично работает коммуникатор, написанный на C #. Теперь мне нужно реализовать безопасное соединение с сервером. Я пытался изменить объекты Socket и TcpClient в SslStream, но получил несколько ошибок.

Сначала я сгенерировал сертификат .cer, используя makecert. Сертификаты OpenSSL у меня не работали, потому что они не включали закрытый ключ. Затем я создал объект сертификата на сервере и связал его с SslStream:

X509Certificate serverCertificate = X509Certificate.CreateFromCertFile("ca.cer");
TcpClient clientSocket = this.tcpListener.AcceptTcpClient();
SslStream ssls = new SslStream(clientSocket.GetStream(), false);
ssls.AuthenticateAsServer(serverCertificate, false, SslProtocols.Tls, true);

На стороне клиента я делаю это:

TcpClient client = new TcpClient(settings.IP, settings.Port);                                
sslStream = new SslStream(client.GetStream(), false,
    new RemoteCertificateValidationCallback(ValidateServerCertificate), null);
sslStream.AuthenticateAsClient(settings.IP);

public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    if (sslPolicyErrors == SslPolicyErrors.None)
        return true;

    Console.WriteLine("Certificate error: {0}", sslPolicyErrors);
    return false;
}

но функция AuthenticateAsClient выдает исключение. Я попробовал несколько других параметров метода, но ничего из этого не помогло мне.

Может ли кто-нибудь помочь мне или объяснить шаг за шагом, как преобразовать простые сокеты в безопасные? Для ясности, SSL не является обязательным требованием - если есть более простой способ сделать соединение безопасным, я могу его использовать.


Edit: Сообщение в исключении следующее:

The remote certificate is invalid according to the validation procedure.

Ответы [ 2 ]

3 голосов
/ 23 июня 2011

Что такое исключение?

Я полагаю, вы получаете исключение, потому что ваш клиентский сертификат отклонен как действительный с сервера (если вы не сделали необходимые действия для установки доверия).

Когда вы используете самозаверяющие сертификаты (те, которые созданы makecert), вам также потребуется предоставить обратный вызов проверки сертификата клиента при создании объекта SslStream.Используйте этот конструктор перегрузки http://msdn.microsoft.com/en-us/library/ms145056.aspx

2 голосов
/ 23 июня 2011
Файл

.CER обычно содержит сертификат без закрытого ключа. Загрузка его на сервер просто не будет работать. Вам также нужен личный ключ. Проще всего сгенерировать сертификат и ключ и сохранить их вместе в формате PFX. Затем загрузите сертификат и ключ от PFX на сервер.

Теперь с вашим кодом только аутентифицируйте только сервер. Это то, что вы хотите сделать (т.е. вы не хотите аутентифицировать клиента на сервере)?

...