3

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.
4

2 に答える 2

3

例外は何ですか?

クライアント証明書がサーバーから有効であるとして拒否されたため、例外が発生していると思います(信頼を設定するために必要なことを行っていない限り)。

自己署名証明書 (makecert によって作成されたもの) を使用する場合、SslStream オブジェクトの作成時にクライアント証明書検証コールバックも提供する必要があります。このコンストラクタ オーバーロードを使用してください http://msdn.microsoft.com/en-us/library/ms145056.aspx

于 2011-06-23T09:36:07.430 に答える
3

.CER ファイルには通常、秘密鍵のない証明書が含まれています。サーバーにロードしても機能しません。秘密鍵も必要です。最も簡単な方法は、証明書とキーを生成し、それらをまとめて PFX 形式で保存することです。次に、サーバー上の PFX から証明書とキーを読み込みます。

コードだけでサーバーを認証するだけです。これはあなたがしたいことですか (つまり、サーバー上でクライアントを認証したくないですか)?

于 2011-06-23T12:35:18.767 に答える