Как предоставить https для домена в ASP. NET Core? - PullRequest
1 голос
/ 10 июля 2020

Я пытался добавить https на свой сайт, который привязан к домену. Поэтому я попытался сгенерировать сертификаты с помощью certbot. Я протестировал эти сертификаты на своем фиктивном сервере, написанном на js. Там все, что мне нужно было сделать, это указать параметры c для сервера Express, например:

var options = {
   key: fs.readFileSync('privkey.pem'),
   cert: fs.readFileSync('fullchain.pem')
};

Пуф, на вкладке ссылок в моем браузере появилась блокировка, говорящая, что мой веб-сайт безопасен. Теперь я хотел переместить его в ядро ​​ASP. NET, поэтому я нашел варианты пустельги, где я могу предоставить свой сертификат:

Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{  
    webBuilder.UseStartup<Startup>();
    webBuilder.ConfigureKestrel(o =>
    {
        o.ConfigureHttpsDefaults(ohttps =>
        {
            ohttps.ClientCertificateMode = Microsoft.AspNetCore.Server.Kestrel.Https.ClientCertificateMode.RequireCertificate;
            ohttps.ServerCertificate = new System.Security.Cryptography.X509Certificates.X509Certificate2(...);
        });
    });
});

Однако похоже, что мне нужно предоставить только сертификат X509, который является сертификатом publi c. Разве частный сертификат не нужен серверу для обеспечения безопасного соединения? Обязательно ли использовать частный сертификат? Как это реализовать в ASP. NET Core? (3,1)

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Я настраиваю параметры Kestrel HTTPS с помощью .UseKestrel. Но параметры также могут быть установлены в методе .ConfigureKestrel.

В этом примере я загружаю сертификат из хранилища сертификатов Windows Servers.

Но есть также перегрузка из UseHttps(ListenOptions, String, String), который принимает имя файла и пароль. ( см. Документацию )

new WebHostBuilder()
.UseKestrel(opt =>
{
        int port = endpointConfig.Port;
        opt.Listen(IPAddress.IPv6Any, port, listenOptions =>
        {
            listenOptions.UseHttps(GetCertificateFromStore(certThumbprint, certStore));
        });
})
.ConfigureServices(
    services => services
        .AddSingleton<StatelessServiceContext>(serviceContext))
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
.UseUrls(url)
.Build();
0 голосов
/ 11 июля 2020

Благодаря ответу johnmoarr и этому ответу я смог понять это. Ключ, предоставленный методу .UseHttps () , должен быть опубликован c ключом в паре с закрытым ключом, что может быть достигнуто путем его генерации с помощью openssl:

openssl pkcs12 -export -out key.pfx -inkey privkey.pem -in fullchain.pem

Затем сгенерированный файл key.pfx можно использовать в методе построения пустельги вместе с паролем, указанным при экспорте сертификата:

Host.CreateDefaultBuilder(args)
    .ConfigureWebHostDefaults(webBuilder =>
    {
        webBuilder
        .UseStartup<Startup>()
        .UseKestrel(o =>
        {
            o.Listen(IPAddress.Any, 443, opt =>
            {
                 opt.UseHttps("YOUR_PATH/key.pfx", "YOUR_EXPORT_PASSWORD");
            });
        });
    });

Кроме того, вы даже можете протестировать его на своем локальном компьютере, поместив свою локальную сеть IP и доменное имя в файле hosts.

...