Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用C生成X509Certificate2对象#_C#_Iis 7_X509certificate2 - Fatal编程技术网

C# 使用C生成X509Certificate2对象#

C# 使用C生成X509Certificate2对象#,c#,iis-7,x509certificate2,C#,Iis 7,X509certificate2,我必须在运行时从web应用程序生成X509Certificate2证书,并将其以字节格式存储在数据库中。我正在使用提供的解决方案。使用此解决方案,您可以生成证书,但也可以在计算机证书存储中创建证书。我不需要证书存在于计算机证书存储中,因此在获得X509Certificate2对象后,我将其从证书存储中删除 此外,由于我的web应用程序在IIS_IUSRS帐户下运行,它不允许我最初使用MachineContext创建证书,因此我必须在UserContext下执行。要在UserContext下创建证

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


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

如果您能够切换到.NET Core,则该方法已失效,并且具有用于创建证书的机箱内解决方案

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,RSA的CertificateRequest中添加了一个RSASignatureAdding required参数。

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