私は、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をインポートする際に問題はありませんでした。私の証明書の詳細では、私は添付された秘密鍵を示す小さなアイコンを見ることができます。
私の個人ストアから証明書を取得するようにクライアントを変更しました。しかし、私は同じ正確な失敗を得ています。
SSLクライアントの認証には、証明書と鍵が必要です。 PEMファイルに両方のファイルが含まれているかどうかを確認する必要があります。そうしないと、重要な部分が欠落しています。 – Robert
PEMには、---- BEGIN CERTIFICATE -----ブロックの下の証明書と、----- BEGIN RSA PRIVATE KEY -----ブロックの下の秘密鍵が含まれています。 –