获取 X509Certificate2 私钥和公钥
Posted
技术标签:
【中文标题】获取 X509Certificate2 私钥和公钥【英文标题】:Get X509Certificate2 Private and Public keys 【发布时间】:2017-09-20 20:38:11 【问题描述】:我在 .NET 4.5 中有一个现有应用程序,我在其中使用 X509Certificate2
私钥和公钥。我正在将其迁移到 .net 核心。我不知道如何将私钥和公钥值读入 XML 格式。我在 .NET 4.5 中有以下代码
var PublicKey = certificate.PublicKey.Key.ToXmlString(false);
var PrivateKey = certificate.PrivateKey.ToXmlString(true);
如何在 .net 核心中实现与删除 PrivateKey
属性相同的效果?
我知道ImportParameters
和ExportParameters
方法可以转换为XML 字符串。但是我正在查看的是访问PublicKey.Key
和PrivateKey
属性,这让我得到了可以转换为RSACrypoServiceProvider 的AsymmetricAlgorithm
对象。
在.netCore 中有GetRSAPublicKey
和GetRSAPrivateKey
方法,它们返回RSACng
对象。使用此证书的应用程序的另一端使用RSACryptoServiceProvider
验证数据。
【问题讨论】:
PrivateKey
将在 .Net Core 2.0 中
【参考方案1】:
X509Certificate2.PrivateKey
和 PublicKey.Key
没有被引入 .NET Core 正是因为每个人都将它们转换为 RSACryptoServiceProvider
。虽然您在 Windows 上获得 RSACng
,但在 Linux 上却是 RSAOpenSsl
。
您实际上应该将所有类型引用更改为 RSA
,因为 .NET 4.6(和 .NET Core 1.0)更正了 RSA 基类以公开所有必需的 Sign/Verify//Encrypt/Decrypt 方法。
.NET Core 无法读取或写入 XML 格式的密钥。即使这些方法在 .NET Core 2.0 中再次存在,它们也只是抛出一个 PlatformNotSupportedException
,因为存在循环依赖:
如果您需要非对称密钥的 XML 序列化,您需要将其写入您自己的库中。
【讨论】:
同意!但是我通过我的证书的应用程序是旧版本的 .net 并使用RSACrytpoServiceProvider
验证数据。当我尝试使用在 .Net 核心 (RSA
) 中创建的证书和 SignedData 进行调用时,我得到 Certificate Invalid 和 Signature invalid 异常。我该如何解决这个问题。关于转换成XML
字符串,是的,我已经创建了自己的扩展方法。以上是关于获取 X509Certificate2 私钥和公钥的主要内容,如果未能解决你的问题,请参考以下文章