У меня отлично работает коммуникатор, написанный на 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.