如何从Bouncy Castle创建X509证书以与AuthenticateAsServer一起使用?

时间:2014-04-14 09:49:54

标签: c# ssl x509certificate bouncycastle x509certificate2

我已经使用Bouncy Castle创建了X509证书,但我无法与SslStream.AuthenticateAsServerSslStream.AuthenticateAsClient一起使用,因为他们(当然)使用.Net版本。 虽然在Bouncy Castle中有一个转换器DotNetUtilities.ToX509Certificate(),它需要一个BC X509并返回.Net X509。 问题似乎是AuthenticateAsServer / AuthenticateAsClient需要包含私钥的证书。至少当我尝试转换然后使用新证书时,我尝试使用SslStream进行连接时得到CryptographicException: "Key does not exist"

所以我认为我需要从Bouncy Castle创建一个X509Certificate2,因为它也可以包含私钥。但我发现的解决方案似乎有点奇怪,而且我想知道现在是否还有其他人更好的方法来使用带有SslStream的BC X509Certificate。

这是我从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);
}

我需要绕道而行,这似乎有点奇怪。通过Pkcs12Store可以创建我的X509Certificate2。

解决方案来自此博客:http://blog.differentpla.net/post/20

1 个答案:

答案 0 :(得分:0)

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