2011-06-23 7 views
3

C#で書かれた、うまく動作しているコミュニケータアプリケーションがあります。今私はサーバーへの安全な接続を実装する必要があります。 SocketとTcpClientオブジェクトをSslStreamに変更しようとしましたが、いくつかのエラーが発生しました。C#SSLセキュアソケット

まず、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. 

答えて

3

例外は何ですか?

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

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

+0

申し訳ありません - 「リモート証明書は検証手順に従って無効です。」 –

+1

自己署名証明書の場合。 (ValidateServerCertificate) – KRam

2

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

コードでは、サーバーの認証のみが行われます。これはあなたがやりたいことですか(つまり、サーバー上のクライアントも認証したくないのですか)。

+0

私はこの問題(秘密鍵は含まれていません)について聞いたことがありますが、私の.cerは大丈夫だと思います。このエラーが出る前に、秘密鍵についての例外がありました。次に、別のプログラムで証明書ファイルを生成し、このエラーを渡しました。 安全な送信のためだけにSSLが必要です。認証は本当に必要ではありません。ソーリー私のラメ、しかし、私はセキュリティに関する講義で眠っていたようだ:) –

+0

@マッテー確かに質問を編集するすべてが変更されました。 sslPolicyErrorsで何を得ましたか? –

関連する問題