HTTP / 2 с ASP.NET Core 2.2 - PullRequest
       30

HTTP / 2 с ASP.NET Core 2.2

4 голосов
/ 18 марта 2019

Я пытаюсь заставить HTTP / 2 работать с ASP.Net Core 2.2.Я тестирую на Windows 10 x64 1809.

Я использую базовый шаблон со следующим компоновщиком веб-хоста:

public static IWebHostBuilder CreateWebHostBuilderKestrel(string[] args)
{
    var builder = WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseKestrel(options =>
        {
            options.Listen(IPAddress.Any, 35000,
                lo =>
                {
                    lo.Protocols = HttpProtocols.Http1AndHttp2;
                    lo.UseHttps(@"path to cert");
                });
        });
    return builder;
}

При использовании Chrome он принимает сертификат и показывает сайтпо HTTPS.Проблема в том, что он использует HTTP / 1.1, а не h2 при проверке сетевых запросов в разделе devtools.

Использование openssl s_client -connect 'host:35000' -cipher "EDH" дает следующий вывод:

New, TLSv1.2, Cipher is DHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : DHE-RSA-AES256-GCM-SHA384
    Session-ID: FA0F0000C66FFFD36BE15AE79B2F48DF631EB83D0425DD534DAA278622CB30AE
    Session-ID-ctx:
    Master-Key: 2B10E9FD71B42328CAFAFBE18789777132565A98CE8CFD9B8E0452F6490929CB6D1B20AB57A000EDBFF40372C93EB547
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1552937526
    Timeout   : 7200 (sec)
    Verify return code: 20 (unable to get local issuer certificate)
    Extended master secret: yes
---

Единственное, чтовыглядит неуместным «Нет согласованного ALPN» и «Поддерживается безопасное повторное согласование».Я что-то здесь упускаю?

На сайте msdn перечислены следующие требования :

TLS version 1.2 or later
Renegotiation disabled
Compression disabled
Minimum ephemeral key exchange sizes:
Elliptic curve Diffie-Hellman (ECDHE) [RFC4492] – 224 bits minimum
Finite field Diffie-Hellman (DHE) [TLS12] – 2048 bits minimum
Cipher suite not blacklisted

Не знаю, как мне проверить большинство этих настроек.Некоторые из них кажутся настройками сертификата, а другие - приложением.

1 Ответ

0 голосов
/ 09 июля 2019

Я не уверен, что это ваш случай, но с похожими проблемами я выяснил странную вещь -

Вот настройка в коде, которая не работает -

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                 .UseKestrel(opt =>
                 {
                     int port = 44336;
                     opt.ListenAnyIP(port, listenOptions =>
                     {
                         listenOptions.UseHttps(@"cert.pfx", "...");
                         listenOptions.Protocols = HttpProtocols.Http1AndHttp2;
                     });
                 })
                .UseStartup<Startup>();

Теперь, , если я сконфигурирую то же самое через appsettings.json , он внезапно начнет обслуживать запросы по HTTP / 2 -

  public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
                WebHost.CreateDefaultBuilder(args)
                    .UseKestrel()
                    .UseStartup<Startup>();

  "AllowedHosts": "*",
  "Kestrel": {
    "EndPoints": {
      "HttpsInlineCertFile": {
        "Url": "https://localhost:44336",
        "Protocols": "Http1AndHttp2",
        "Certificate": {
          "Path": "./cert.pfx",
          "Password": "..."
        }
      }
    }
  }

Кроме того, вот мои мысли о требованиях:

  • TLS версии 1.2 или новее - Я думаю, что любой браузер / скрипач / почтальон сможет предоставить вам эту информацию.
  • Повторное согласование отключено - если я не ошибаюсь, повторное согласование сервера было отключено начиная с TLS 1.2. В противном случае может помочь установка для параметра реестра DisableRenegoOnServer ненулевого значения - HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ SecurityProviders \ SCHANNEL \ DisableRenegoOnServer | DWORD = 1
  • Сжатие отключено - не уверен, но, вероятно, речь идет о сжатии ответов, которое вы задали бы в своем коде запуска
  • Минимальные временные размеры обмена ключами - вы можете проверить вкладку DevTools / Security в Chrome, и я знаю, что FireFox может предоставить вам еще больше деталей. Проверьте Как определить, какой шифр используется HTTPS-соединением .
  • Набор шифров не занесен в черный список - как только вы узнаете о соединении, вы можете проверить BadCipherSuites
...