C# Can';t通过SslStream发送客户端证书
我正在使用SslStream进行SSL3握手,但是,尽管我尽了最大努力,SslStream从未代表我发送客户端证书。代码如下:C# Can';t通过SslStream发送客户端证书,c#,ssl,bouncycastle,C#,Ssl,Bouncycastle,我正在使用SslStream进行SSL3握手,但是,尽管我尽了最大努力,SslStream从未代表我发送客户端证书。代码如下: SSLConnection = new System.Net.Security.SslStream(SSLInOutStream, false, new System.Net.Security.RemoteCertificateValidationCallback(AlwaysValidRemoteCertificate), new System.Net.Securit
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);
然后我总是让ValidRemoteCertificate返回true,然后选择LocalCertificate返回数组的第0个元素
代码可能看起来有点奇怪,因为这个项目有点奇怪,但我认为这与这里的重点无关。SSL握手完成。问题在于,SslStream不是代表我(在握手过程中)发送带有ASN.1编码证书(MyLocalCertificate)的证书消息,而是发送SSL警报编号41(无证书),然后继续。我从包嗅探中知道这一点。握手完成后,SslStream标记被验证为true,ISMUTUALLYAUTHENTATED为false,其LocalCertificate成员为null
我觉得我可能错过了一些很明显的东西,所以任何想法都会很感激。我是SSL的新手,而且这个项目已经脱离了常规,所以我有点不知所措
附言1:我的ChooseLocalCertificate例程在握手过程中被调用两次,并且两次都返回一个有效的(据我所知)非空证书
附言2:SSLInOutStream是我自己的课程,不是网络流。就像我说的,虽然,握手进行得很正常,所以我怀疑这是罪魁祸首。。。但是谁知道呢?我不熟悉用于SSL的Bouncycastle.NET API,但乍看之下,我猜您没有向API提供私钥
即使私钥本身从未发送到服务器,也需要对某些数据进行数字签名,以便向服务器证明您持有该数据。应该有一些API为这个签名操作提供私钥。出于某种原因,网站不允许我对上面发布的解决方案发表评论,但它解决了我的问题。以下是我的评论: 嘿,这是一个很好的猜测,它解决了我的问题。非常感谢你。C#X509Certificate类似乎不支持设置私钥,但子类X509Certificate2支持。我不得不用BouncyCastle的东西胡闹了一下,但是实现(如果将来有人需要的话)是这样的:
MyLocalCertificate是bouncycastle的X509Certificate类的实例,MyPrivateKey是bouncycastle的AsymmetricipherKeyPair的实例。请提供指向API文档的链接。
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);