C# 理解c语言中的自签名证书#
最近我遇到了一个c代码: 仔细查看CertificateRequest构造函数参数,rsa密钥描述如下: 一种RSA密钥,其公钥材料将包含在证书或证书请求中。如果调用CreateSelfSigned(DateTimeOffset,DateTimeOffset)方法,此密钥将用作私钥。 粗体部分是我不太理解的部分。这是否意味着在对证书进行自签名时,将使用给定的RSA密钥对证书进行签名,并将与公钥相同的密钥添加到证书中 根据我对TLS的理解,我们有两个公钥对,一个用于签名,一个用于加密。CA使用其私钥对证书进行签名,并向客户端提供公钥,以通过使用公钥解密来验证签名,然而,服务提供商提供了一个公钥,客户端使用该公钥首先在tls握手中加密其密钥,然后使用服务提供商的私钥解密C# 理解c语言中的自签名证书#,c#,.net,ssl,.net-core,tls1.2,C#,.net,Ssl,.net Core,Tls1.2,最近我遇到了一个c代码: 仔细查看CertificateRequest构造函数参数,rsa密钥描述如下: 一种RSA密钥,其公钥材料将包含在证书或证书请求中。如果调用CreateSelfSigned(DateTimeOffset,DateTimeOffset)方法,此密钥将用作私钥。 粗体部分是我不太理解的部分。这是否意味着在对证书进行自签名时,将使用给定的RSA密钥对证书进行签名,并将与公钥相同的密钥添加到证书中 根据我对TLS的理解,我们有两个公钥对,一个用于签名,一个用于加密。CA使用其私
但是,在上面的代码示例中,我们创建了一个证书,其中包含了什么内容?服务器公钥用于加密,但用于解密签名的密钥是什么?发送加密数据时,公钥是从私钥派生的,并且发送的每个消息的公钥都不同。接收端还需要相同的私钥来解密消息,同时需要传输的公钥来解密消息。证书没有签名。参见Wiki示例:“证书没有签名”Wiki文章在这里证明了您的错误:“证书包括有关密钥的信息、有关其所有者(称为主体)身份的信息以及已验证证书内容的实体(称为颁发者)的数字签名”加密中的签名通常是“加密值”,而不是身份信息。加密有黑色数据(未加密)和红色数据(加密数据)。签名是加密的红色数据。@TobiasvonFalkenhayn:忽略jdweng很重要,他是一个巨大的错误信息海报。你的理解是正确的。现在对于自签名的情况,实际上您是您自己的CA,从密钥对将公钥放入证书请求中,然后使用来自同一密钥对的私钥对该证书请求进行签名。如果查看几乎所有CA的根证书,您将看到它们是自签名的。只需在浏览器中查看此网站的根目录。证书中的公钥也用于验证它。这就是自签名证书不表示信任的原因,您必须基于其他考虑因素信任它或不信任它。发送加密数据时,公钥是从私钥派生的,并且发送的每个消息的公钥都不同。接收端还需要相同的私钥来解密消息,同时需要传输的公钥来解密消息。证书没有签名。参见Wiki示例:“证书没有签名”Wiki文章在这里证明了您的错误:“证书包括有关密钥的信息、有关其所有者(称为主体)身份的信息以及已验证证书内容的实体(称为颁发者)的数字签名”加密中的签名通常是“加密值”,而不是身份信息。加密有黑色数据(未加密)和红色数据(加密数据)。签名是加密的红色数据。@TobiasvonFalkenhayn:忽略jdweng很重要,他是一个巨大的错误信息海报。你的理解是正确的。现在对于自签名的情况,实际上您是您自己的CA,从密钥对将公钥放入证书请求中,然后使用来自同一密钥对的私钥对该证书请求进行签名。如果查看几乎所有CA的根证书,您将看到它们是自签名的。只需在浏览器中查看此网站的根目录。证书中的公钥也用于验证它。这就是为什么自签名证书不表示信任,而您必须基于其他考虑因素信任它或不信任它。
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)));
...
}
...