C# で記述された、うまく機能するコミュニケーター アプリケーションがあります。次に、サーバーへの安全な接続を実装する必要があります。Socket および TcpClient オブジェクトを SslStream に変更しようとしましたが、いくつかのエラーが発生しました。
まず、makecert を使用して .cer 証明書を生成しました。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 は要件ではありません。接続を安全にする簡単な方法があれば、それを使用できます。
編集:例外のメッセージは次のとおりです。
The remote certificate is invalid according to the validation procedure.