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