Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.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# 如何从Bouncy Castle创建X509证书以与服务器一起使用?_C#_Ssl_X509certificate_Bouncycastle_X509certificate2 - Fatal编程技术网

C# 如何从Bouncy Castle创建X509证书以与服务器一起使用?

C# 如何从Bouncy Castle创建X509证书以与服务器一起使用?,c#,ssl,x509certificate,bouncycastle,x509certificate2,C#,Ssl,X509certificate,Bouncycastle,X509certificate2,我使用Bouncy Castle创建了一个X509证书,但我不能将其与SslStream.authenticatesServer或SslStream.authenticatesClient一起使用,因为它们(当然)使用.Net版本。 虽然Bouncy Castle中有一个转换器,DotNetUtilities.ToX509Certificate(),它接受一个BC X509并返回一个.Net X509。 问题似乎是AuthenticateTaserver/AuthenticateTasClien

我使用Bouncy Castle创建了一个X509证书,但我不能将其与
SslStream.authenticatesServer
SslStream.authenticatesClient
一起使用,因为它们(当然)使用.Net版本。 虽然Bouncy Castle中有一个转换器,
DotNetUtilities.ToX509Certificate()
,它接受一个BC X509并返回一个.Net X509。 问题似乎是AuthenticateTaserver/AuthenticateTasClient需要包含私钥的证书。至少当我尝试转换然后使用新证书时,当尝试使用SslStream连接时,我会得到一个
加密异常:“密钥不存在”

所以我认为我需要从Bouncy Castle创建一个X509Certificate2,因为它也可以包含私钥。但我发现的解决方案似乎有点…奇怪,我想知道现在是否还有其他人能更好地将BC X509证书与SslStream一起使用

以下是我如何从BC证书创建X509Certificate2的方法:

private static X509Certificate CreateDotNetCertificate(Org.BouncyCastle.X509.X509Certificate certificate, AsymmetricCipherKeyPair keyPair)
{
   var store = new Pkcs12Store();
   string friendlyName = certificate.SubjectDN.ToString();
   var certificateEntry = new X509CertificateEntry(certificate);
   store.SetCertificateEntry(friendlyName, certificateEntry);
   store.SetKeyEntry(friendlyName, new AsymmetricKeyEntry(keyPair.Private), new[] { certificateEntry });

   var stream = new MemoryStream();
   var password = "a password";
   store.Save(stream, password.ToCharArray(), new SecureRandom(randomGenerator));

   return new X509Certificate2(stream.ToArray(), password, X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
}
我需要绕道PKCS12商店才能创建X509Certificate2,这似乎有点奇怪


此解决方案来自此博客:

Windows使用存储在Windows证书存储中的证书。我不知道BouncyCastle是否提供对Windows CertStorage的直接访问,但如果没有,唯一的选择是从文件(或其他来源)将证书导入CertStorage,然后使用它。PKCS#12是将证书与其私钥一起传输的正确格式,因此很自然地将其用作中间媒介

你的链接断了。你能添加正确的答案吗?很难相信使用API“这么难”,但我对这篇文章投了更高的票,因为这是我在互联网上找到的唯一一个答案,肯定很难看,但很有效!