HTTP/2 与 ASP.NET Core 2.2

Posted

技术标签:

【中文标题】HTTP/2 与 ASP.NET Core 2.2【英文标题】:HTTP/2 with 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; 【参考方案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

【讨论】:

以上是关于HTTP/2 与 ASP.NET Core 2.2的主要内容,如果未能解决你的问题,请参考以下文章

不能将“Microsoft.AspNet.OData.Routing.ODataRoute”与端点路由一起使用。 ASP Net Core 2.2 的异常

获取 ASP.NET-Core 2.2 控制器中的控制器名称和方法名称

Simple ASP.NET CORE 2.2 App +Vue JS

使用Http-Repl工具测试ASP.NET Core 2.2中的Web Api项目

总结:利用asp.net core日志进行生产环境下的错误排查(asp.net core version 2.2,用IIS做服务器)

Asp .NET Core 2.2 Razor 页面布局和局部