Мне нужно запустить автономный веб-сервер на определенном порту с HTTPS из настольного приложения C# для Windows без использования IIS.
Чтобы узнать, есть ли способ сделать это, не требуется установка сертификата HTTPS в Windows с помощью netsh. Простой легкий сервер, который может загрузить сертификат и/или создать его во время выполнения. Мне просто нужно иметь возможность читать запросы URL и программно возвращать контент на основе этого.
Встроенные .NET и сторонние предложения приветствуются! Я не смог ничего найти.
Бонусные баллы, если также не требуются разрешения администратора (избегая использования netsh для добавления пространства имен порта, которое требуется для большинства встроенных http-библиотек .NET)
Спасибо!
Попробуйте использовать .Net Core с веб-сервером Kestral.
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-2.1
Параметры SSL
options.Configure(context.Configuration.GetSection("Kestrel"))
.Endpoint("HTTPS", opt =>
{
opt.HttpsOptions.SslProtocols = SslProtocols.Tls12;
});
SSL-сертификат
.UseKestrel(options =>
{
options.Listen(IPAddress.Loopback, 8000);
options.Listen(IPAddress.Loopback, 8001, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
});
});
Kestral — это базовый компонент от Microsoft, специально предназначенный для .Net Core.
Помимо решения Kestral, предоставленного Тоддом (спасибо!), я обнаружил стороннюю библиотеку под названием Ceen.Httpd — это очень легкий HTTPd-сервер, который я смог просто добавить в свой проект, поддерживающий SSL.
https://github.com/kenkendk/ceenhttpd
Использование SSL было довольно простым, вот пример кода, который они предоставляют, адаптированный для использования SSL.
var tcs = new CancellationTokenSource();
var config = new ServerConfig()
.AddLogger(new CLFStdOut())
.AddRoute(new FileHandler(args.Length == 0 ? "." : args[0]));
var usessl = true;
config.SSLCertificate = new X509Certificate2("idsrv3test.pfx", "idsrv3test");
var task = HttpServer.ListenAsync(
new IPEndPoint(IPAddress.Any, 9000),
usessl,
config,
tcs.Token
);