从 x509Certificate2 启动 RSACryptoServiceProvider 的最佳方式?
Posted
技术标签:
【中文标题】从 x509Certificate2 启动 RSACryptoServiceProvider 的最佳方式?【英文标题】:Best way to initiate RSACryptoServiceProvider from x509Certificate2? 【发布时间】:2011-08-17 21:20:35 【问题描述】:从我从密钥库中取出的X509Certificate2
启动新的RSACryptoServiceProvider
对象的最佳方法是什么?证书与公共(用于加密)和私有(用于解密)密钥相关联。
我目前正在使用FromXmlString
方法,但一定有更好的方法。
谢谢
【问题讨论】:
请考虑将接受的答案更改为 Rosdi Kasim 的答案。当前接受的答案现在非常过时且不可靠。 【参考方案1】:推荐的方式是使用RSA
基类并调用certificate.GetRSAPrivateKey()
。
RSA publicKeyProvider = certificate.GetRSAPrivateKey();
从 .NET 4.6 开始,不再建议按照 @blowdart 的建议强制转换为 RSACryptoServiceProvider
。由于 .NET 有多个版本(例如 .NET Core),这现在更是一个问题。
通过这种方式转换为RSACryptoServiceProvider
,您很有可能会收到此转换异常(取决于所使用的平台和库):
无法将“System.Security.Cryptography.RSACng”类型的对象转换为“System.Security.Cryptography.RSACryptoServiceProvider”类型
原因是每个平台的实际实现可能不同,在 Windows 上使用RSACng
。
Here is a link that describes this issue(寻找 Jeremy Barton 的答案)。
【讨论】:
我能够通过这种方法继续前进。【参考方案2】:Blowdart 的回答确实是正确的。但是,为了清楚起见,我应该指出,如果您希望您的 RSACryptoServiceProvider 实例包含 both X509 证书的公钥和私钥(假设证书确实有私钥)。检查证书的 HasPrivateKey 属性。
RSACryptoServiceProvider rsa;
if (cert.HasPrivateKey)
rsa = (RSACryptoServiceProvider)cert.PrivateKey;
else
rsa = (RSACryptoServiceProvider)cert.PublicKey.Key;
在只有公钥存在的 RSA 情况下,RSA 参数将只有指数和模数,所有其他参数都为空;另一方面,如果存在私钥,则 RSA 参数将包含 D、DP、DQ、Exponent、InverseQ、Modulus、P 和 Q。
【讨论】:
(RSACryptoServiceProvider)(c.HasPrivateKey ? c.PrivateKey : c.PublicKey.Key);但是:我永远不会这样做。当我打算将提供程序用于需要它的东西时,我只会加载私钥 - 当然,只加载公钥是没有帮助的。 Dag 是正确的,但要澄清一下……我想用私钥解密,或者用公钥加密。在任何情况下,我都想要任何可用的东西。【参考方案3】:RSACryptoServiceProvider publicKeyProvider =
(RSACryptoServiceProvider)certificate.PublicKey.Key;
和
RSACryptoServiceProvider privateKeyProvider =
(RSACryptoServiceProvider)certificate.PrivateKey;
证书的公钥或私钥属性的密钥属性是 AsymmetricAlgorithm 类型。
【讨论】:
感谢吹镖,工作就像一个魅力。也许我应该买你的书。 注意:应该是certificate.PrivateKey;
而不是certificate.PrivateKey.Key;
很好的答案,简短而甜蜜。非 RSA 提供者是否无关紧要?推测这些属性是 AsymmetricAlgorithm 是有原因的,并且不能保证它们的运行时类型实际上是 RSACryptoServiceProvider..?
不起作用'System.InvalidCastException:'无法将'System.Security.Cryptography.RSACng'类型的对象转换为'System.Security.Cryptography.RSACryptoServiceProvider'。''
我收到错误“无法将 'System.Security.Cryptography.RSACng' 类型的对象转换为类型 'System.Security.Cryptography.RSACryptoServiceProvider'。”在 .NET Core 3.1 中以上是关于从 x509Certificate2 启动 RSACryptoServiceProvider 的最佳方式?的主要内容,如果未能解决你的问题,请参考以下文章
X509Chain.Build(...) System.InvalidCastException 从 X509Certificate 到 X509Certificate2
如何从 PKCS#12 字节数组构造 X509Certificate2 抛出 CryptographicException(“系统找不到指定的文件。”)?
如何在.net 中创建一个全新的 x509Certificate2?
使用 ASP.NET Core 3.0 内置 API 从 .crt 和 .key 文件创建 X509Certificate2