使用openssl/makecert工具创建x509证书

5
我将使用以下参数使用makecert创建x509证书:

makecert -r -pe -n "CN=Client" -ss MyApp

我想使用此证书使用RSA算法加密和解密数据。我查看了在Windows证书存储中生成的证书,一切似乎都很正常(它有一个私钥,公钥是一个具有1024位的RSA密钥等)。
现在我使用以下C#代码加密数据:
X509Store store = new X509Store("MyApp", StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certs = store.Certificates.Find(X509FindType.FindBySubjectName, "Client", false);
X509Certificate2 _x509 = certs[0];

using (RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)_x509.PublicKey.Key)
{
    byte[] dataToEncrypt = Encoding.UTF8.GetBytes("hello");
    _encryptedData = rsa.Encrypt(dataToEncrypt, true);
}

执行Encrypt方法时,我收到了一个带有“Bad key”消息的CryptographicException异常。我认为代码没问题,可能是我没有正确创建证书。有任何建议吗?谢谢。
---------------- EDIT -------------- 如果有人知道如何使用OpenSsl创建证书,对我来说也是一个有效的答案。

创建证书时,您指定的私钥/公钥对的位数是多少?可能需要指定更长的键,如4048位? - berkay
我不确定您在谈论哪个选项。我只是在makecert命令中使用了我上面展示的选项。如果您说的是另一个选项,请假定默认值。但我的公钥有1024位。 - Zé Carlos
好的,那我从来没有使用过makecert,只是搜索创建了4048位。1024位已经不安全了,因此您可能会遇到错误。 - berkay
谢谢Berkay。我尝试了选项-len 2048和-len 4096。但问题仍然存在。 - Zé Carlos
2
这个网站http://www.enterprisedt.com/products/edtftpnetpro/doc/manual/privatekeyaccessproblems.html提供了一套不错的步骤,用于创建和导出证书。 - Steve Wranovsky
2个回答

4
为了让密钥用于加密,您应该使用 -sky-option。默认情况下,`makecert` 使用 AT_SIGNATURE 密钥规范,这将无法进行加密/解密。相反,通过发出以下命令,使其使用 AT_KEYEXCHANGE 规范:
makecert -r -pe -n "CN=Client" -ss MyApp -sky Exchange

(请记得删除先前的密钥或使用另一个容器名称。)

我了解到RSA算法可以用于签名和加密消息。一个证书中不可能同时包含密码和签名密钥吗? - Zé Carlos
1
AT_KEYEXCHANGE 可用于签名和加密,但反过来不行。 - Rasmus Faber

1

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