私は、openssl ベースのクライアントが openssl サーバーと対話する完全に機能するシステムを持っています。各クライアントには、サーバーによって検証される独自の証明書があります。証明書は openssl (X509、pem) で生成されています。それらは自己署名されています。
SslStream に基づいてテスト クライアントを書きたいと思います。SslStream クラスのドキュメントのクライアントの例を使用しました。
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
現在、呼び出されることはありません(驚いたことに)。
どうすればそれをデバッグできますか? あなたが私の問題を解決できればさらに良いです。
アップデート
ドキュメントのX509Chain の例に基づいて、チェーンの検証を実行する関数を追加しました。2 つの興味深いメッセージを含む、証明書に関するあらゆる種類の情報が表示されます。
Element certificate is valid: False
Element error status length: 1
最後に、verify を呼び出したときよりも詳しい情報はありません。
の出力はopenssl verify cert.pem
異常を報告しません。
error 18 at 0 depth lookup:self signed certificate
OK
アップデート
pem から秘密鍵と証明書を抽出し、cert.pfx (pkcs12) を生成しました。個人のキー ストアに cert.pfx をインポートしても問題はありませんでした。証明書の詳細に、添付された秘密鍵を示す小さなアイコンが表示されます。
個人ストアから証明書を取得するようにクライアントを変更しました。しかし、私はまったく同じ失敗をしています。