Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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语言中的自签名证书#_C#_.net_Ssl_.net Core_Tls1.2 - Fatal编程技术网

C# 理解c语言中的自签名证书#

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使用其私

最近我遇到了一个c代码:

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

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

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

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


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

发送加密数据时,公钥是从私钥派生的,并且发送的每个消息的公钥都不同。接收端还需要相同的私钥来解密消息,同时需要传输的公钥来解密消息。证书没有签名。参见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)));

    ...
}

...