Обход неверного сертификата SSL для сервера Kestrel, отображаемого в WebView2
Данный
- Приложение WPF запускает сервер Kestrel
- Пустельга слушает
http://0.0.0.0:5000
а такжеhttps://0.0.0.0:6000
- Kestrel указывает на статический HTML-файл
index.html
- WPF показывает элемент управления браузером WebView2, который указывает на
https://127.0.0.1:6000/index.html
Полученные результаты
- Если WebView2 указывает на
http://127.0.0.1:5000/index.html
все работает нормально - Если WebView2 указывает на
https://127.0.0.1:6000/index.html
Я получаю сообщение об ошибке ненадежного сертификата
Вопрос
- Можно ли отключить или игнорировать проверку SSL для localhost в Kestrel или WebView2
Не следует трогать настройки Windows, например, пометить сертификат "localhost" как доверенный в "msmc" или создать самозаверяющие сертификаты, потому что это приложение WPF должно работать на разных компьютерах.
Другими словами, должен быть более простой способ, чем описано в этой статье.
Пустельга
общедоступный класс WebServer { общедоступная статическая задача Run() { var configuration = new ConfigurationBuilder().Build(); var urls = new[] { "http://0.0.0.0:7000", "https://0.0.0.0:8000" }; var environment = WebHost.CreateDefaultBuilder(новая строка [0]).UseConfiguration(конфигурация).UseUrls(URL-адреса).UseContentRoot(Directory.GetCurrentDirectory()).UseIISIntegration().UseStartup(); вернуть environment.Build().RunAsync(); } } общедоступный класс WebStartup { общедоступная конфигурация IConfiguration {получить; } общедоступный WebStartup(конфигурация IConfiguration) { Конфигурация = конфигурация; } public void ConfigureServices (службы IServiceCollection) { services.AddSpaStaticFiles (конфигурация => { configuration.RootPath = "index.html"; }); } public void Configure(приложение IApplicationBuilder, IWebHostEnvironment env) { app.UseDeveloperExceptionPage(); //app.UseHsts(); //app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseSpaStaticFiles(); } }
Элемент управления WebView2 в WPF
общедоступный MainWindow() { WebServer.Run(); InitializeComponent(); WebView.Source = новый Uri("https://127.0.0.1:6000/index.html"); // HTTP на 5000 работает, HTTPS 6000 - нет WebView.NavigationCompleted += (отправитель объекта, аргументы CoreWebView2NavigationCompletedEventArgs) => { WebView.InvalidateVisual(); }; }
2 ответа
WebView2 в настоящее время не предоставляет эту функцию напрямую. Если хотите, вы можете открыть вопрос в WebView2 Feedback, и мы можем сделать запрос функции.
В качестве обходного пути вы можете попробовать использовать метод CoreWebView2.CallDevToolsProtocolMethodAsync для вызова метода Security.setIgnoreCertificateErrors DevTools Protocol. Однако я не пробовал setIgnoreCertificateErrors, и он также помечен как экспериментальный, поэтому не уверен, что он будет работать так, как вы хотите.
расширения
public static CoreWebView2EnvironmentOptions AddArg(this CoreWebView2EnvironmentOptions options, string arg)
{
options.AdditionalBrowserArguments += $" {arg}";
return options;
}
public static CoreWebView2EnvironmentOptions AddArg(this CoreWebView2EnvironmentOptions options, string arg,string value)
{
options.AdditionalBrowserArguments += $" {arg}={value}";
return options;
}
ручная настройка
var env = await CoreWebView2Environment.CreateAsync(userDataFolder: "Cache",
options:new CoreWebView2EnvironmentOptions()
.AddArg("--ignore-certificate-errors")
);
await _webBrowser.EnsureCoreWebView2Async(env);