【问题标题】:HTTP/2 with ASP.NET Core 2.2HTTP/2 与 ASP.NET Core 2.2
【发布时间】:2019-08-09 06:25:46
【问题描述】:

我正在尝试让 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 显示网站。问题是它在 devtools 部分检查网络请求时使用的是 HTTP/1.1 而不是 h2。

使用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”和“支持安全重新协商”。我在这里错过了什么吗?

The msdn site lists the following requirements:

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

不知道如何检查大部分这些设置。其中一些似乎是证书的设置,而另一些似乎是特定于应用程序的。

【问题讨论】:

  • 您使用哪个版本的 OpenSSL 来测试您的网站?
  • @Barry Old 会低估它(我真的只用它来创建自签名证书进行测试),但我明天会尝试使用最新版本并使用结果。
  • OpenSSL 1.0.2 之前的版本不支持 ALPN,因此不会协商它 - 即使您的服务器支持它。
  • @Barry 我正在运行OpenSSL 1.1.0i 14 Aug 2018,所以这不是问题。
  • 您是否确认您的目标版本正确? &lt;TargetFramework&gt;netcoreapp2.2&lt;/TargetFramework&gt;

标签: c# .net asp.net-core http2


【解决方案1】:

我不确定是不是你的情况,但是有类似的问题,我发现了一件奇怪的事情 -

这是代码中不起作用的设置 -

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 或更高版本 - 我想任何浏览器/Fiddler/Postman 都应该能够为您提供此信息。
  • 重新协商已禁用 - 如果我没记错的话,服务器重新协商自 TLS 1.2 起已禁用。否则,将 DisableRenegoOnServer 注册表项设置为非零值会有所帮助 - HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\SCHANNEL\DisableRenegoOnServer| DWORD=1
  • 已禁用压缩 - 不确定,但可能与您在启动代码中设置的响应压缩有关
  • 最小的临时密钥交换大小 - 您可以查看 Chrome 中的 DevTools/Security 选项卡,我知道 FireFox 可以为您提供更多详细信息。查看How-to-identify-the-Cipher-used-by-an-HTTPS-Connection
  • 密码套件未列入黑名单 - 了解连接后,您可以查看BadCipherSuites

【讨论】:

    猜你喜欢
    • 2019-07-19
    • 2019-09-21
    • 1970-01-01
    • 2019-08-25
    • 2019-06-15
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多