首页 > 解决方案 > 如何使用 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 指纹识别的更多信息:

http://webcache.googleusercontent.com/search?q=cache:https://www.akamai.com/us/en/multimedia/documents/white-paper/passive-fingerprinting-of-http2-clients-white-论文.pdf

问题

尽管 Spring、Netflix Zuul 和 Jetty 嵌入式服务器都有完整的文档,但我一直无法找到一种方法来实现类似的解决方案来检索 HTTP2 帧设置。

标签: javaspring-bootembedded-jettynetflix-zuul

解决方案


您可以扩展HTTP2ServerConnectionFactory和覆盖protected ServerSessionListener newSessionListener(Connector connector, EndPoint endPoint)以返回您的自定义实现(可以委托给原始实现)。

通过这种方式,您可以访问低级 HTTP/2 帧(作为对象,而不是字节格式),这可能允许您对客户端进行指纹识别。


推荐阅读