让.NET应用支持Http/3,QUIC协议
1. 必备条件
1.1 .NET应用开启https
Programe.cs中配置了https支持,
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, options) =>
{
options.ListenAnyIP(5001, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
listenOptions.UseHttps();
});
});
或者appsettings.json中配置了https协议,建议在下面位置配置:
"Kestrel": {
"Endpoints": {
"Https": {
"Url": "https://*:7190",
"Protocols": "Http1AndHttp2AndHttp3", //自签名证书不能用于http3,一旦满足条件,kestrel会自动添加Alt-svc标头
"Certificate": {
"Path": "your_cert.pfx",
"Password": "your_cert_password"
}
}
}
}
经过测试Cloudflare的证书,可以用于开启服务端的http3,访问时可以看到Alt-Svc标头。
1.2 . 系统环境
Windows11/Windows Server 2012
直接运行
Ubuntu 24.04
添加 Microsoft 软件包库
wget https://packages.microsoft.com/config/ubuntu/24.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt-get update
安装 libmsquic 包
sudo apt-get install libmsquic
我安装后查看是2.4版,配和.NET 9没有问题。
在安装之前,无论怎么配https, 都看不懂Alt-Svc标头,安装后就有了。
1.3 开放端口,UDP也要开
sudo ufw allow 443
2. 测试验证
2.1 浏览器请用Chrome或者Edge最新版
自签名证书
-
浏览器不允许在 HTTP/3 上使用自签名证书,例如 Kestrel 开发证书,Cloudflare的10年证书
- 如果一定要用可以用下面方式强制开启http3/quic
方式一
chrome.exe --origin-to-force-quic-on=localhost:6001 https://localhost:6001
方式二
Chrome://flags, 启用访问http3使用自签名证书。
使用浏览器信任机构发行的证书:
- 腾讯云/阿里云的免费证书可以。let's encrypt的证书可以。所以请在appsettings.json中使用这种证书。
- 服务端配置了这种证书的,直接打开Chrome浏览器访问即可。
查看协议
如果没看到,不要着急,清下缓存,勾选停用缓存再看看,多试几次。
也可以换用Edge看看。
2.2 代理问题
- 代理通常不支持http/3,请关闭代理
- IPv4可能存在多级NAT,某些路由支持的NAT类型有限制,导致UDP打不开,不易连上http3. 建议使用IPv6测试,IPv6是Peer to Peer.
3. 原文链接:
https://www.500599.xyz/posts/dotnet/enable_http3/