c# - 了解 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 握手,之后使用服务提供商私钥解密。
但是,在上面的代码示例中,我们创建的证书究竟包含什么?服务器公钥用于加密,但解密签名的密钥是什么?
解决方案
推荐阅读
- jquery - 调整宽度
用于显示特定数量的行
- java - 我的 android studio 正在我的手机上安装两个应用程序/apk
- powershell - 尝试创建弹出窗口时方法调用失败
- ansible - 受管节点上特定 sudo 命令的 ansible 行为
- python - 如何将不同长度的字符串转换为不同精度的时间戳进行pandas插值?
- javascript - insertBefore javascript,在链接之间添加元素
- unity3d - WebGL Build 后约 5 秒的黑色 Unity 默认对象
- c# - 如何使用 asp.net C# web 表单隐藏 asp 控件
- javascript - 基于由数组组成的对象替换句子中的单词
- python - 如何创建一个可以连续输入金额并以美元显示剩余金额的财务程序