Библиотека .NET для запуска встроенного/самостоятельного легкого веб-сервера из C# с SSL/TLS HTTPS

Мне нужно запустить автономный веб-сервер на определенном порту с HTTPS из настольного приложения C# для Windows без использования IIS.

Чтобы узнать, есть ли способ сделать это, не требуется установка сертификата HTTPS в Windows с помощью netsh. Простой легкий сервер, который может загрузить сертификат и/или создать его во время выполнения. Мне просто нужно иметь возможность читать запросы URL и программно возвращать контент на основе этого.

Встроенные .NET и сторонние предложения приветствуются! Я не смог ничего найти.

Бонусные баллы, если также не требуются разрешения администратора (избегая использования netsh для добавления пространства имен порта, которое требуется для большинства встроенных http-библиотек .NET)

Спасибо!

Ответы (2)

Попробуйте использовать .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
        );