В настоящее время я работаю над обновлением приложения C#/.NET с .NET 6.0 до .NET 8.0 на виртуальной машине Linux (я работаю на ПК), и у меня возникли некоторые проблемы с работой конечных точек HTTPS. Я наткнулся на эту статью, когда искал решения, но я не на 100% уверен, что это действительно проблема, а если это так, то я не знаю, как ее исправить :). Я извлекаю пару X509Certificate2
crt/ключ из локальной файловой системы и использую ее для создания IHostBuilder
объекта, использующего HTTPS. Ниже приведен текущий код, с которым я работаю:
var certContents = File.ReadAllText(<local filepath>);
var certKeyContents = File.ReadAllText(<local key filepath>);
var cert = X509Certificate2.CreateFromPem(certContents, certKeyContents);
return Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder
.UseContentRoot(Directory.GetCurrentDirectory())
.UseKestrel(options =>
{
options.AddServerHeader = false;
options.Listen(IPAddress.Any, port, ops =>
{
ops.UseHttps(cert);
});
}
})
.UseStartup<Startup>();
})
.ConfigureLogging(logging =>
{
})
.UseNLog();
Результатом этого обычно является страница с ошибкой, на которой просто отображается сообщение «Этот сайт не может обеспечить безопасное соединение». Для тестирования этих вызовов я в основном использовал Google Chrome v122.0 и Postman v9.31. Я установил точки останова в коде, и кажется, что я даже не могу добраться до серверной части с этими ошибками, поскольку эти точки останова никогда не срабатывают. Интересно, что я обнаружил, что могу продвинуться немного дальше, используя FireFox (например, он, кажется, может получить доступ к серверной части); он не выдает ошибок SSL, а вместо этого пытается получить доступ к экземпляру Keycloak нашего приложения (не размещенному локально), чтобы проверить наш токен SSO, и выдает ошибку IDX20803. Ниже приведен дополнительный код исключения из этого:
System.InvalidOperationException: IDX20803: Unable to obtain configuration from: '<Keycloak URL>'.
at Microsoft.IdentityModel.Protocols.ConfigurationManager`1.GetConfigurationAsync(CancellationToken cancel)
at Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync()
at Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync()
at Microsoft.AspNetCore.Authentication.AuthenticationHandler`1.AuthenticateAsync()
at Microsoft.AspNetCore.Authentication.AuthenticationService.AuthenticateAsync(HttpContext context, String scheme)
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
Я также заметил несколько ошибок IDX20803, которые больше соответствуют этому шаблону. Этот код отлично работает в .NET 6, но, должно быть, мне что-то не хватает в обновленных версиях .NET — любые рекомендации приветствуются!
То, что я уже пробовал
options.Listen()
попыталась добавить приведенный ниже блок кода.
opt.AllowAnyClientCertificate();
opt.ClientCertificateValidation = (certif, chain, policyErrors) => true;
opt.ClientCertificateMode = Microsoft.AspNetCore.Server.Kestrel.Https.ClientCertificateMode.AllowCertificate;
opt.ServerCertificate = cert;
opt.SslProtocols = System.Security.Authentication.SslProtocols.Tls12
| System.Security.Authentication.SslProtocols.Ssl3
| System.Security.Authentication.SslProtocols.Tls
| System.Security.Authentication.SslProtocols.None
| System.Security.Authentication.SslProtocols.Tls11
| System.Security.Authentication.SslProtocols.Tls13
| System.Security.Authentication.SslProtocols.Default;
В обратном вызове options.Listen()
попробовал удалить вызов ops.UseHttps(cert)
.
В начале моих файлов Program.cs и Startup.cs я попытался добавить эту строку: ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.SystemDefault | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls | SecurityProtocolType.Tls13;
В методе Настройка файла Startup.cs добавьте app.UseHttpsRedirection();
Возможно, это связано с этим: https://github.com/dotnet/aspnetcore/issues/54366
Посмотрите, поможет ли это:
options =>
{
options.Listen(System.Net.IPAddress.Loopback, your-port, httpnOptions =>
{
httpOptions.UseHttps(new HttpsConnectionAdapterOptions { SslProtocols = SslProtocols.Tls12 });
}
}))
если это поможет, есть проблема с TLS 1.3. Судя по всему, патч выпустят в мае.