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
,所以这不是问题。
您是否确认您的目标版本正确? <TargetFramework>netcoreapp2.2</TargetFramework>
【参考方案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做服务器)