如何在C#中导入由OpenSSL创建的PKCS#8 RSA私钥

5

我正在尝试找到一种在不使用外部库的情况下,在C#中读取使用OpenSSL PKCS#8 RSA创建的私钥的方法。

有人知道我该如何做吗?

3个回答

5

嗨,有没有针对 .Net Core 2 的解决方案? - Chew Hong Yu

2
这个问题使用外部库最简单的方法是使用(免费的) Chillkat 公共/私有密钥组件:使用它,导入密钥可以使用 只需几行代码完成,如果你愿意支付大约149美元购买该库的其余部分,那么处理通用加密概念也会变得更容易。
与常规的Microsoft .NET Framework不同,Mono项目似乎具有可用PKCS8实现C#源代码。如果你绝对不能依赖外部库,这可能是一个适合的起点,假设与Mono代码相关的(LGPL 2.0)许可证适合您...
最后,PKCS#8格式 不太难解析,RSA / DSA 密钥对对象按照 PKCS#11 的规范进行,一旦你弄清楚所有的细节,就相对容易转换为.NET X509Certificate。我曾经在VB.NET中完成了这个任务,但很遗憾我不能分享那段代码。

我需要一些免费且开源的东西。但还是谢谢你的帮助。 - Makah
我相信这很容易做到,但我不想这样做。这就是为什么我使用那个库。它简单、开源且免费。 - Makah

1

感谢您的回答。

我使用OpenSSL编写了一个创建RSA密钥的脚本:

(Linux脚本)

openssl genrsa -out ${NAME}_openssl.key 2048
openssl pkcs8 -topk8 -in ${NAME}_openssl.key -nocrypt > ${NAME}.key
openssl req -new -x509 -key ${NAME}.key -out ${NAME}.crt -outform DER

在C#中,我们需要使用XML格式的私钥。我使用了this解析器来完成这个任务。

为了解密挑战,我们需要使用:

  byte[] challange = server.getChallenge();

  RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider();

  rsaProvider.FromXmlString(Demo.Properties.Resources.XmlPrivateKey);

  byte[] plaintext = rsaProvider.Decrypt(challange, false);

为了使用服务器证书加密,我们需要使用:

  RSACryptoServiceProvider rsaProvider = x509.PublicKey.Key as RSACryptoServiceProvider;

  byte[] answer = RsaProvider.Encrypt(plaintext, false);

感谢JavaScience咨询公司


1
问题是如何导入PKCS#8,而不是将密钥作为XML文件导入。 - BerndK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接