在搭载Jetty嵌入式服务器的Spring Cloud Zuul过滤器中如何获取HTTP2帧设置
问题背景
我目前正在开展一项安全领域的项目,研究各类HTTP被动指纹识别技术。我计划用于指纹识别的请求维度包括client hello、header顺序、HTTP2帧设置、HTTP2伪头顺序。目前我已经通过扩展Jetty的org.eclipse.jetty.util.ssl.SslContextFactory.Server类封装SSLEngine实例,实现了从client hello中获取密码套件、压缩方法和扩展的方案,可在Zuul过滤器中按如下方式访问client hello数据:
private static final String SSL_SESSION_ATTRIBUTE = "org.eclipse.jetty.servlet.request.ssl_session"; @Override public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); SSLSession sslSession = (SSLSession) request.getAttribute(SSL_SESSION_ATTRIBUTE); ClientHello clientHello = (ClientHello) sslSession.getValue("client-hello"); return null; }
问题描述
虽然Spring、Netflix Zuul、Jetty嵌入式服务器均有完善的文档,但我暂未找到与上述方案类似的HTTP2帧设置获取方案,希望能得到可行的实现思路。
实现思路
你可以沿用扩展Jetty核心组件的思路落地,具体步骤如下:
- 扩展Jetty的HTTP2连接处理类:继承
org.eclipse.jetty.http2.server.HTTP2ServerConnection,重写onSettings方法捕获客户端上报的SETTINGS帧全量参数,重写onHeaders方法统计请求伪头的排序规则,这两类数据就是你需要的HTTP2核心指纹维度。 - 绑定指纹数据到会话:将采集到的HTTP2指纹对象存入当前连接对应的SSL会话属性中,自定义存储key例如
http2-fingerprint,和你之前存储ClientHello的逻辑对齐,避免额外的上下文传递链路。 - 替换默认连接工厂:自定义实现
HTTP2ServerConnectionFactory,重写newConnection方法返回你扩展后的HTTP2连接实例,再将这个自定义工厂配置到Jetty的HTTP2连接器中,替换原有默认实现。 - Zuul过滤器侧无需做大幅改动,和你读取ClientHello的逻辑一致,直接从SSL会话中读取你存入的HTTP2指纹对象即可。
内容的提问来源于stack exchange,提问作者D0M1N0.
相关产品推荐
相关产品推荐

