繁体   English   中英

无法通过SslStream发送客户端证书

[英]Can't send client certificate via SslStream

我正在使用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例程在握手期间被调用两次,并且两次都返回一个有效的(据我所知)非空证书。

PS 2:SSLInOutStream是我自己的类,而不是NetworkStream。 就像我说的那样,握手大多是正常的,所以我怀疑这是罪魁祸首......但谁知道呢?

出于某种原因,该网站不会让我对上面发布的解决方案发表评论,但它解决了我的问题。 这是我的评论:

嘿,这是一个很好的猜测,它解决了我的问题。 非常感谢你。 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的实例。

我不熟悉用于SSL的Bouncycastle .NET API,但是初看起来,我猜你没有提供API的私钥。

即使私钥本身从未发送到服务器,也需要对某些数据进行数字签名,以便向服务器证明您持有它。 应该有一些API为此签名操作提供私钥。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM