获取 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 属性相同的效果?

我知道ImportParametersExportParameters 方法可以转换为XML 字符串。但是我正在查看的是访问PublicKey.KeyPrivateKey 属性,这让我得到了可以转换为RSACrypoServiceProvider 的AsymmetricAlgorithm 对象。

在.netCore 中有GetRSAPublicKeyGetRSAPrivateKey 方法,它们返回RSACng 对象。使用此证书的应用程序的另一端使用RSACryptoServiceProvider 验证数据。

【问题讨论】:

PrivateKey 将在 .Net Core 2.0 中 【参考方案1】:

X509Certificate2.PrivateKeyPublicKey.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,因为存在循环依赖:

Cryptography.Algorithms -> XML XML -> 网络(包括 TLS) 网络/TLS -> X509Certificates X509Certificates -> Cryptography.Algorithms

如果您需要非对称密钥的 XML 序列化,您需要将其写入您自己的库中。

【讨论】:

同意!但是我通过我的证书的应用程序是旧版本的 .net 并使用 RSACrytpoServiceProvider 验证数据。当我尝试使用在 .Net 核心 (RSA) 中创建的证书和 SignedData 进行调用时,我得到 Certificate Invalid 和 Signature invalid 异常。我该如何解决这个问题。关于转换成XML 字符串,是的,我已经创建了自己的扩展方法。

以上是关于获取 X509Certificate2 私钥和公钥的主要内容,如果未能解决你的问题,请参考以下文章

X509Certificate2类怎样导入一个公钥字符串

使用X509Certificate2类操作证书文件

X509Certificate2类怎样导入一个公钥字符串

使用私钥将 X509Certificate2 导出到字节数组

Javascript ECDSA 获取私钥和​​公钥?

如何读取 .pem 文件以获取私钥和​​公钥