首页 > 解决方案 > 了解 C# 中的自签名证书

问题描述

最近我遇到了这个 c# 代码:

var dn = new X500DistinguishedName($"CN={_appSettings.CommonName};OU={_appSettings.OrganizationalUnit}", X500DistinguishedNameFlags.UseSemicolons);
SubjectAlternativeNameBuilder sanBuilder = new SubjectAlternativeNameBuilder();
sanBuilder.AddUri(new Uri($"urn:{_appSettings.ApplicationUri}"));

using (RSA rsa = RSA.Create(2048))
{
    var request = new CertificateRequest(dn, rsa, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);

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

    var selfSignedCert = request.CreateSelfSigned(new DateTimeOffset(DateTime.UtcNow.AddDays(-1)), new DateTimeOffset(DateTime.UtcNow.AddDays(3650)));

    ...
}

...

仔细查看 CertificateRequest 构造函数参数,rsa 密钥描述为:

一个 RSA 密钥,其公钥材料将包含在证书或证书请求中。如果调用 CreateSelfSigned(DateTimeOffset, DateTimeOffset) 方法,则此密钥用作私钥。

粗体部分是我不太明白的部分。这是否意味着在自签名证书时,证书是使用给定的 RSA 密钥签名的,并将与公钥相同的密钥添加到证书中?

在我对 TLS 的理解中,我们有两个公钥对,一个用于签名,一个用于加密。CA 使用其私钥签署证书,并向客户端提供公钥以通过使用公钥解密签名来验证签名,而服务提供者提供公钥,客户端首先使用该公钥加密其密钥。 tls 握手,之后使用服务提供商私钥解密。

但是,在上面的代码示例中,我们创建的证书究竟包含什么?服务器公钥用于加密,但解密签名的密钥是什么?

标签: c#.netssl.net-coretls1.2

解决方案


推荐阅读