Во время выполнения созданный самоподписанный сертификат не работает, если его не экспортировать и не восстановить в netcore (3.1) - PullRequest
0 голосов
/ 25 мая 2020

Может кто-нибудь объяснить, почему следующий сертификат работает только с aspnetcore, если он «экспортирован» и «восстановлен»?

Пожалуйста, посмотрите на строку возврата CreateSelfSignedServerCertificate , что я имею в виду с экспортом и восстановлением.

Если отключить возвращаемое значение функции CreateSelfSignedServerCertificate в строку «без экспорта» при доступе к любому https-uri с сервера выкидывает

В пакете безопасности нет учетных данных

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

namespace WebApplication1
{
    public class Program
    {
        public static void Main(string[] args)
        {
            X509Certificate2 cert = CreateSelfSignedServerCertificate();
            var builder = Host.CreateDefaultBuilder(args);

            IHost host = builder
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
                webBuilder.ConfigureKestrel(o =>
                {
                    o.ListenAnyIP(5555, o2 =>
                    {
                        o2.UseHttps(cert);
                    });
                });
            })
            .Build();
            host.Run();
        }

        static X509Certificate2 CreateSelfSignedServerCertificate()
        {
            SubjectAlternativeNameBuilder sanBuilder = new SubjectAlternativeNameBuilder();
            sanBuilder.AddIpAddress(IPAddress.Any);
            sanBuilder.AddIpAddress(IPAddress.Loopback);
            sanBuilder.AddIpAddress(IPAddress.IPv6Loopback);
            var addresses = Dns.GetHostEntry(Dns.GetHostName()).AddressList.Where(t => t.AddressFamily == AddressFamily.InterNetwork).ToList();
            addresses.ForEach(t => sanBuilder.AddIpAddress(t));
            sanBuilder.AddDnsName("localhost");
            sanBuilder.AddDnsName(Environment.MachineName);

            X500DistinguishedName distinguishedName = new X500DistinguishedName($"CN=localhost");

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

                request.CertificateExtensions.Add(
                    new X509KeyUsageExtension(
                        X509KeyUsageFlags.DataEncipherment
                        | X509KeyUsageFlags.KeyEncipherment
                        | X509KeyUsageFlags.DigitalSignature, false));

                request.CertificateExtensions.Add(
                   new X509EnhancedKeyUsageExtension(
                       new OidCollection { new Oid("1.3.6.1.5.5.7.3.1") }, false));

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

                X509Certificate2 certificate = request.CreateSelfSigned(
                    new DateTimeOffset(DateTime.UtcNow.AddDays(-1)), new DateTimeOffset(DateTime.UtcNow.AddYears(30)));
                certificate.FriendlyName = "localhost";

                return new X509Certificate2(certificate.Export(X509ContentType.Pfx)); // exporting cert works with aspnetcore
                //return certificate; // non exported cert doesn't work with aspnetcore
            }
        }
    }
}
...