Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';t通过SslStream发送客户端证书_C#_Ssl_Bouncycastle - Fatal编程技术网

C# Can';t通过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

我正在使用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);
然后我总是让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);