c# - 从 Cert 和 Key 创建 X509Certificate2,无需创建 PFX 文件

标签 c# ssl certificate x509certificate2

过去,我一直通过导出带密码的 PFX 证书来制作安全的 TcpListener,但我想知道是否可以跳过此步骤。

我没有使用商业 SSL 证书,并且有一个用于颁发服务器证书的根 CA。在 C# 中托管 TcpListener 时,这些服务器证书需要额外的步骤(我猜是因为没有使用 CSR)...但是如果我有私钥和 OpenSSL 生成/使用的证书怎么办。

sslCertificate = new X509Certificate2("myExportedCert.pfx", "1234");

这很好,但是我必须发出一个 openssl 命令来从证书和私钥创建一个 pfx 文件,然后设置一些密码。然后将此密码包含在我的代码中。

我想知道这一步是否非常必要。有没有办法从证书中组成 X509Certificate2,然后应用私钥。构造函数参数仅允许证书部分,但加密失败,因为没有私钥。

此外,我不想依赖 OpenSSL 或 IIS 来导出 pfx.... 看起来很笨拙。

理想情况下我想:

sslCertificate = new X509Certificate2("myCert.crt");
sslCertificate.ApplyPrivateKey(keyBytes) // <= or "private.key" or whatever

sslStream.AuthenticateAsServer(sslCertificate, false, SslProtocols.Default, false);

最佳答案

您要求的有几种不同的东西,而且难易程度也不同。

将私钥附加到证书

从 .NET Framework 4.7.2 或 .NET Core 2.0 开始,您可以组合证书和 key 。它不会修改证书对象,而是生成一个知道 key 的新证书对象。

using (X509Certificate2 pubOnly = new X509Certificate2("myCert.crt"))
using (X509Certificate2 pubPrivEphemeral = pubOnly.CopyWithPrivateKey(privateKey))
{
    // Export as PFX and re-import if you want "normal PFX private key lifetime"
    // (this step is currently required for SslStream, but not for most other things
    // using certificates)
    return new X509Certificate2(pubPrivEphemeral.Export(X509ContentType.Pfx));
}

在 .NET Framework(但不是 .NET Core)上,如果您的私钥是 RSACryptoServiceProviderDSACryptoServiceProvider,您可以使用 cert.PrivateKey = key,但这有复杂的副作用,因此不鼓励。

加载私钥

这个比较难,除非你已经解决了。

大多数情况下,答案在 Digital signature in c# without using BouncyCastle 中。 ,但如果您可以迁移到 .NET Core 3.0,事情就会变得容易得多。

PKCS#8 私钥信息

从 .NET Core 3.0 开始,您可以相对简单地执行此操作:

using (RSA rsa = RSA.Create())
{
    rsa.ImportPkcs8PrivateKey(binaryEncoding, out _);
    // do stuff with the key now
}

(当然,如果您有 PEM,则需要通过提取 BEGIN 和 END 定界符之间的内容并通过 Convert.FromBase64String 运行它来“去除 PEM”,以获得二进制编码).

PKCS#8 加密私钥信息

从 .NET Core 3.0 开始,您可以相对简单地执行此操作:

using (RSA rsa = RSA.Create())
{
    rsa.ImportEncryptedPkcs8PrivateKey(password, binaryEncoding, out _);
    // do stuff with the key now
}

(如上所述,如果它是 PEM,您需要先“去 PEM”)。

PKCS#1 RSAPrivateKey

从 .NET Core 3.0 开始,您可以相对简单地执行此操作:

using (RSA rsa = RSA.Create())
{
    rsa.ImportRSAPrivateKey(binaryEncoding, out _);
    // do stuff with the key now
}

(如果是 PEM,则为相同的“de-PEM”)。

关于c# - 从 Cert 和 Key 创建 X509Certificate2,无需创建 PFX 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55456807/

相关文章:

java - 将 Base64 编码的 CER 文件保存到字符串

powershell - 在 Web 请求中信任 HTTPS 站点的证书

php - Delphi 应用程序的 SSL 证书 - 是否需要启用安全性?

java - 如何验证服务器是否支持 TLS 1.0 协议(protocol)?

c# - 在 C# 中,我有一个指向 WIN32 WndProc 的 IntPtr。调用它的语法是什么?

c# - 根据角色确定用户是否有权访问给定的 Controller 操作

ruby-on-rails - 为什么 SSL 在 Puma 开发应用程序上有效,但在生产环境中运行时却无效?

Powershell脚本为多个服务器远程获取网站的证书到期

c# - 也对 Action 使用 func 方法?

c# - 翻译实现