我正在使用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);
Run Code Online (Sandbox Code Playgroud)
然后我让AlwaysValidRemoteCertificate返回true,而ChooseLocalCertificate返回数组的第0个元素.
代码可能看起来有点奇怪,因为该项目有点奇怪,但我认为这不是重点.SSL握手完成.问题是,代替我(在握手过程中)使用ASN.1编码证书(MyLocalCertificate)发送证书消息,SslStream发送SSL警报号41(无证书),然后继续.我从数据包嗅探中知道这一点.握手完成后,SslStream将IsAuthenticated标记为true,将IsMutuallyAuthenticated标记为false,并将其LocalCertificate成员标记为null.
我觉得我可能错过了一些非常明显的东西,所以任何想法都会受到赞赏.我是SSL的新手,这个项目不在人迹罕至,所以我有点不知所措.
PS 1:我的ChooseLocalCertificate例程在握手期间被调用两次,并且两次都返回一个有效的(据我所知)非空证书.
PS 2:SSLInOutStream是我自己的类,而不是NetworkStream.就像我说的那样,握手大多是正常进行的,所以我怀疑这是罪魁祸首......但谁知道呢?