java - 如何使用 Jetty 嵌入服务器在 Spring Cloud Zuul 过滤器中检索 HTTP2 帧设置?
问题描述
背景
我目前正在开展一个项目,该项目旨在研究各种 HTTP 被动指纹识别技术以确保安全。我计划对请求进行指纹识别的某些方面包括客户端问候、标头顺序、HTTP2 帧设置和 HTTP2 伪标头顺序。到目前为止,我已经实现了一个解决方案,通过扩展 Jetty 的org.eclipse.jetty.util.ssl.SslContextFactory.Server
类来包装 SSLEngine 实例,从客户端 hello 中检索密码套件、压缩方法和扩展。然后我可以在 Zuul 过滤器中访问客户端 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;
}
有关 HTTP2 指纹识别的更多信息:
问题
尽管 Spring、Netflix Zuul 和 Jetty 嵌入式服务器都有完整的文档,但我一直无法找到一种方法来实现类似的解决方案来检索 HTTP2 帧设置。
解决方案
您可以扩展HTTP2ServerConnectionFactory
和覆盖protected ServerSessionListener newSessionListener(Connector connector, EndPoint endPoint)
以返回您的自定义实现(可以委托给原始实现)。
通过这种方式,您可以访问低级 HTTP/2 帧(作为对象,而不是字节格式),这可能允许您对客户端进行指纹识别。
推荐阅读
- python-3.x - 如何解决 JupyterLab 中的“nbconvert failed: Inkscape svg to pdf conversion failed”
- c# - 枚举值在剃须刀页面 ASP.NET Core 3.1 上不显示 EnumMember 值
- struts - 如何更改 Struts 1.3 HTML 单选按钮的颜色
- python - 在 NetworkX 中创建大图时出现内存错误
- javascript - 在javascript中按布尔值、姓氏和名称对数组进行排序
- python-3.x - 状态更改为活动后,Tkinter 按钮未更改回正确的颜色
- r - 如何使用 dplyr 和 shift 添加新列并计算递归 cum
- node.js - 带有时间戳的 Winson 不添加时间戳
- c++ - 当我尝试运行我的 c++ 程序时,它说“使用未声明的标识符”,但它在标题中声明
- python - “ValueError : list.remove(x): x not in list”当 x 在列表中时