2012-07-13 29 views
5

私は、opensslベースのクライアントがopensslサーバーと対話する完全に機能するシステムを持っています。各クライアントには、サーバーによって検証される独自の証明書があります。証明書はopenssl(X509、pem)で生成されています。彼らは自己署名しています。SslStreamクライアントがstunnelサーバーとのハンドシェークを完了できません

ここで、SslStreamに基づいてテストクライアントを作成します。私はSslStreamクラスdocumentationのクライアントの例を使用しました。

私のSslStreamクライアントはハンドシェイクを完了できません。 stunnelはクライアントが証明書を送信しないことについて不平を言います。これはWiresharkで確認されています(ハンドシェイクメッセージの証明書長さ:0)。

X509Certificate cert = new X509Certificate2(filename, password); 
X509CertificateCollection certColl = new X509CertificateCollection(); 
certColl.Add(cert); 

:これは私が私の証明書をロードする方法であるメッセージを受信した予期しない、またはひどく

フォーマットされました:

内部例外

は:

私のクライアントは、次の例外が表示されます私は証明書のさまざまなプロパティ(例:GetSerialNumberString())を取得しようとしました。できます。 Verifyメソッドはfalseを返します。これは私が調査しようとしている次のものです。

どうすればセットアップ私のSslStreamが(同じ結果)は関係していないよう:

認証と同じ
sslStream.AuthenticateAsClient(serverName); 

SslStream sslStream = new SslStream(
    client.GetStream(), 
    false, 
    new RemoteCertificateValidationCallback(ValidateServerCertificate), 
    new LocalCertificateSelectionCallback(SelectLocalCertificate)); 

sslStream.AuthenticateAsClient(serverName); 

sslStream.AuthenticateAsClient(serverName, 
    certColl, 
    SslProtocols.Tls, 
    true); 

SelectLocalCertificateする(2回)と呼ばれ、自分の証明書を返します。 ValidateServerCertificateは現在(私の驚きに)呼び出されることはありません。

どうすればデバッグできますか?あなたが私の問題を釘付けにすることができればさらに良い。

UPDATE

私は、ドキュメントからX509Chain exampleに基づいてチェーンの検証を実行する機能を追加しました。これは、2つの魅力的なメッセージを含む、証明書にあらゆる種類の情報を表示します。最後に

Element certificate is valid: False 
Element error status length: 1 

が、私は本当に私が検証呼び出すときよりも多くの詳細を持っていません。

openssl verify cert.pemの出力では、珍しいことは報告されません。

error 18 at 0 depth lookup:self signed certificate 
OK 

UPDATE

Iは、PEMから秘密鍵と証明書を抽出し、Iはcert.pfx(PKCS12)を生成しました。個人的なキーストアにcert.pfxをインポートする際に問題はありませんでした。私の証明書の詳細では、私は添付された秘密鍵を示す小さなアイコンを見ることができます。

私の個人ストアから証明書を取得するようにクライアントを変更しました。しかし、私は同じ正確な失敗を得ています。

+0

SSLクライアントの認証には、証明書と鍵が必要です。 PEMファイルに両方のファイルが含まれているかどうかを確認する必要があります。そうしないと、重要な部分が欠落しています。 – Robert

+0

PEMには、---- BEGIN CERTIFICATE -----ブロックの下の証明書と、----- BEGIN RSA PRIVATE KEY -----ブロックの下の秘密鍵が含まれています。 –

答えて

4

解決方法は、自分のWindowsマシンにCAルート証明書をインポートすることでした。私のクライアントは今、握手を完了することができます!

より完全なSslStreamの例を検索して解決策を見つけました。 http://geekswithblogs.net/luskan/archive/2007/10/01/115758.aspxに感謝します。

+0

ルートCA証明書をWindowsストアの信頼できる機関フォルダにインストールし、Windowsストアからクライアント証明書をロードする必要があります。ファイルからクライアント証明書をロードするときには機能しませんでした。したがって、クライアントとサーバーの両方のルートCAはWindowsストアに存在する必要があります。 Thanks – AlexandruC

+0

Windows/.NETでは、証明書ストアにプライベートキーが存在しない場合は、プライベートキーを使用できません。それは設計によるものです。 –

関連する問題