SslStreamを使用してSSL3ハンドシェイクを実行していますが、最善の努力にもかかわらず、SslStreamが私に代わってクライアント証明書を送信することはありません。コードは次のとおりです。
SSLConnection = new System.Net.Security.SslStream(SSLInOutStream, false, new System.Net.Security.RemoteCertificateValidationCallback(AlwaysValidRemoteCertificate), new System.Net.Security.LocalCertificateSelectionCallback(ChooseLocalCertificate));
X509CertificateCollection CC = new X509CertificateCollection();
CC.Add(Org.BouncyCastle.Security.DotNetUtilities.ToX509Certificate(MyLocalCertificate));
SSLConnection.AuthenticateAsClient("test", CC, System.Security.Authentication.SslProtocols.Ssl3, false);
次に、AlwaysValidRemoteCertificateがtrueを返し、ChooseLocalCertificateが配列の0番目の要素を返します。
プロジェクトが少し変なので、コードはおそらく少し変に見えますが、それはここでのポイントの脇にあると思います。SSLハンドシェイクが完了します。問題は、ASN.1でエンコードされた証明書(MyLocalCertificate)を使用して(ハンドシェイクプロセスで)証明書メッセージを送信する代わりに、SslStreamがSSLアラート番号41(証明書なし)を送信して続行することです。私はこれをパケットスニッフィングから知っています。ハンドシェイクが完了すると、SslStreamはIsAuthenticatedをtrue、IsMutuallyAuthenticatedをfalseとしてマークし、そのLocalCertificateメンバーはnullになります。
私はおそらくここでかなり明白な何かを見逃しているように感じるので、どんなアイデアでもいただければ幸いです。私はSSLの初心者であり、このプロジェクトは道に迷っているので、ちょっと途方に暮れています。
PS 1:ハンドシェイク中にChooseLocalCertificateルーチンが2回呼び出され、有効な(私が知る限り)、null以外の証明書を両方とも返します。
PS 2:SSLInOutStreamは私自身のクラスであり、NetworkStreamではありません。しかし、私が言ったように、ハンドシェイクはほとんど正常に進行するので、これが原因ではないかと思います...しかし、誰が知っていますか?