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