4

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ではありません。しかし、私が言ったように、ハンドシェイクはほとんど正常に進行するので、これが原因ではないかと思います...しかし、誰が知っていますか?

4

2 に答える 2

7

どういうわけか、サイトは私が上記の解決策にコメントを残すことを許可しませんが、それは私の問題を解決しました。これが私のコメントです:

ねえ、それは素晴らしい推測でした、そしてそれは私の問題を修正しました。どうもありがとうございます。C#X509Certificateクラスは秘密鍵の設定をサポートしていないようですが、ドータークラスX509Certificate2はサポートしています。私はBouncyCastleのものを少しいじくり回さなければなりませんでしたが、実装(将来誰かがそれを必要とする場合)はこれです:

X509CertificateCollection CC = new X509CertificateCollection();
X509Certificate2 C2 = new X509Certificate2(MyLocalCertificate.GetEncoded());
C2.PrivateKey = Org.BouncyCastle.Security.DotNetUtilities.ToRSA((Org.BouncyCastle.Crypto.Parameters.RsaPrivateCrtKeyParameters)MyPrivateKey.Private);
CC.Add(C2);

MyLocalCertificateは、bouncycastleのX509Certificateクラスのインスタンスであり、MyPrivateKeyは、bouncycastleのAsymmetricCipherKeyPairのインスタンスです。

于 2010-05-28T23:03:20.240 に答える
5

私はSSL用のBouncycastle.NETAPIに精通していませんが、一見すると、APIに秘密鍵を提供していないと思います。

秘密鍵自体がサーバーに送信されることはありませんが、サーバーに保持していることを証明するために、一部のデータにデジタル署名する必要があります。この署名操作に秘密鍵を提供するためのAPIが必要です。

于 2010-05-28T22:30:47.760 に答える