【问题标题】:Generating X509Certificate2 object using C#使用 C# 生成 X509Certificate2 对象
【发布时间】:2017-05-16 11:19:54
【问题描述】:

我必须在运行时从我的 Web 应用程序生成 X509Certificate2 证书,并将其以字节格式存储在我的数据库中。我正在使用here 提供的解决方案。使用此解决方案,您可能能够生成证书,但它也会在机器证书存储中创建它。我不需要证书存在于机器证书存储中,因此我在获得 X509Certificate2 对象后将其从证书存储中删除。

此外,由于我的 Web 应用程序在 IIS_IUSRS 帐户下运行,它最初不允许我使用 MachineContext 创建证书,因此我必须在 UserContext 下进行。即使在 UserContext 下也要创建证书,有一个名为“加载用户配置文件”的应用程序池属性应设置为 true。现在我能够获得所需的结果,但我想检查该方法或在 IIS 中将“加载用户配置文件”设置为 true 是否存在任何问题。

【问题讨论】:

  • 您生成证书的目的是什么?
  • 我们将使用这些证书进行加密。这些证书将以加密格式存储在数据库中。加密这些证书的密钥将保存在 HSM 中。
  • 您应该使用对称密钥进行加密,并使用 HSM 上的主密钥保护这些密钥。

标签: c# iis-7 x509certificate2


【解决方案1】:

如果您能够切换到 .NET Core,2.0 preview 已经推出,并且有一个内置的证书创建解决方案。

using System.Security.Cryptography.X509Certificates;

...

private static X509Certificate2 MakeLocalhostCert()
{
    using (ECDsa key = ECDsa.Create(ECCurve.NamedCurves.nistP384))
    {
        var request = new CertificateRequest(
            "CN=localhost",
            key,
            HashAlgorithmName.SHA384);

        request.CertificateExtensions.Add(
            new X509BasicConstraintsExtension(false, false, 0, true));

        const X509KeyUsageFlags endEntityTypicalUsages =
            X509KeyUsageFlags.DataEncipherment |
            X509KeyUsageFlags.KeyEncipherment |
            X509KeyUsageFlags.DigitalSignature |
            X509KeyUsageFlags.NonRepudiation;

        request.CertificateExtensions.Add(
            new X509KeyUsageExtension(endEntityTypicalUsages, true));

        var sanBuilder = new SubjectAlternativeNameBuilder();
        sanBuilder.AddDnsName("localhost");
        sanBuilder.AddIpAddress(IPAddress.Loopback);
        sanBuilder.AddIpAddress(IPAddress.IPv6Loopback);

        request.CertificateExtensions.Add(sanBuilder.Build());

        request.CertificateExtensions.Add(
            new X509EnhancedKeyUsageExtension(
                new OidCollection
                {
                    // server authentication
                    new Oid("1.3.6.1.5.5.7.3.1"),
                },
                false));

        DateTimeOffset now = DateTimeOffset.UtcNow;

        return request.CreateSelfSigned(now, now.AddDays(90));
    }
}

预览后 RSA 密钥的证书发生了重大变化1,RSASignaturePadding 必需参数已添加到 RSA 的 CertificateRequest ctor。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多