如何在.NET Core 3.1中读取TLS扩展类型?
.NET Core 3.1读取自定义TLS扩展类型的实现方案
由于.NET Core 3.1的ITlsHandshakeFeature仅暴露了SNI、TLS协议版本等有限的握手信息,无法直接获取自定义TLS扩展,需要通过Kestrel的TLS认证回调来实现:
步骤1:配置Kestrel的TLS握手回调
在Startup.cs的ConfigureServices方法中,配置Kestrel的HTTPS选项,添加握手时的自定义处理逻辑,获取并保存扩展数据:
using Microsoft.AspNetCore.Server.Kestrel.Core; using System.Threading.Tasks; public void ConfigureServices(IServiceCollection services) { services.Configure<KestrelServerOptions>(options => { options.ConfigureHttpsDefaults(httpsOptions => { httpsOptions.OnAuthenticate = (context, sslOptions) => { // 获取ClientHello阶段的握手信息 var clientHelloInfo = context.Features.Get<SslClientHelloInfo>(); if (clientHelloInfo != null) { // 替换为第三方网关使用的自定义扩展类型编号(十六进制转十进制) const int customExtensionType = 0xXXXX; if (clientHelloInfo.Extensions.TryGetValue(customExtensionType, out byte[] extensionData)) { // 将扩展数据存入上下文,供后续请求处理使用 context.Items["CustomTlsExtensionData"] = extensionData; } } return Task.CompletedTask; }; }); }); // 其他服务配置... services.AddControllersWithViews(); }
步骤2:在请求处理中读取扩展数据
在Controller或自定义中间件中,从HttpContext.Items中取出保存的扩展数据,根据网关约定解析:
public class HomeController : Controller { public IActionResult Index() { if (HttpContext.Items.TryGetValue("CustomTlsExtensionData", out object dataObj) && dataObj is byte[] extensionData) { // 示例:将字节数组转为UTF-8字符串,实际需根据网关的扩展格式解析 string extensionValue = System.Text.Encoding.UTF8.GetString(extensionData); // 执行业务逻辑... } return View(); } }
注意事项
- 必须明确第三方网关使用的自定义扩展类型编号(可参考IANA的TLS扩展类型列表,或网关提供的文档)
- 扩展数据为原始字节数组,解析规则需与网关的扩展格式完全匹配(如是否有长度前缀、编码格式等)
- 握手回调执行在TLS建立阶段,避免在此处执行耗时操作,影响连接建立效率
内容的提问来源于stack exchange,提问作者NeverEndingLearner
相关产品推荐
相关产品推荐

