如何通过 ALPN 在 Jetty SPDY 上使用客户端证书?

Posted

技术标签:

【中文标题】如何通过 ALPN 在 Jetty SPDY 上使用客户端证书?【英文标题】:How to work with client certificates on Jetty SPDY with ALPN? 【发布时间】:2014-11-16 07:22:36 【问题描述】:

当我将 SPDY 与 Jetty 一起使用时,我遇到了客户端证书问题。

当我使用 NPN 并使用以下方式启动 Jetty SPDY 服务器时它可以工作:

SSLconnector = new HTTPSPDYServerConnector(server, sslContextFactory);

作为baseRequest.getHttpChannel(),它使用org.eclipse.jetty.spdy.server.http.HttpChannelOverSPDY,我可以读取SSL_SESSION_ID之类的SSL属性和客户端证书,代码如下:

// ... HttpServletRequest request
java.security.cert.X509Certificate client_certs[] = (java.security.cert.X509Certificate[])request.getAttribute("javax.servlet.request.X509Certificate");

但 NPN 在 Java8 中不是一个选项(请参阅我的问题 How to run Jetty with SPDY using ALPN?)。在 Java8 中,我必须使用 ALPN 协议,例如:

sslContextFactory.setWantClientAuth(w3srv_config.want_client_auth);
// ...
HttpConfiguration httpConfig = new HttpConfiguration();

SslConnectionFactory ssl = new SslConnectionFactory(sslContextFactory, "alpn");
ALPNServerConnectionFactory alpn = new ALPNServerConnectionFactory("spdy/3", "http/1.1");
alpn.setDefaultProtocol("http/1.1");
HTTPSPDYServerConnectionFactory spdy = new HTTPSPDYServerConnectionFactory(SPDY.V3, httpConfig);
HttpConnectionFactory http = new HttpConnectionFactory(httpConfig);

SSLconnector = new ServerConnector(server, new ConnectionFactory[]ssl, alpn, spdy, http);
//...

当我想获得任何与 SSL 相关的 javax.servlet.request.* 时,我得到了 null。它的baseRequest.getHttpChannel()org.eclipse.jetty.server.HttpConnection$HttpChannelOverHttp

我必须更改哪些内容才能使用客户端证书?

【问题讨论】:

【参考方案1】:

您要查找的 javax.servlet.request.* 属性由 Jetty 的 SecureRequestCustomizer 设置,您需要将其添加到您在上面的代码示例中创建的 httpConfig 对象中。

我猜测您的 NPN 配置略有不同,或者您在 Jetty 中使用了一些实用方法,该方法使用 NPN 为您执行此操作,但不使用 ALPN。

只是在做:

HttpConfiguration httpConfig = new HttpConfiguration();
httpConfig.addCustomizer(new SecureRequestCustomizer());

应该足以解决您的问题。

【讨论】:

我做了一些非标准的东西,比如排除一些协议,但我没有配置 NPN 和 ALPN。我只是更改启动 jar 并更改我的问题中的启动代码。无论如何使用httpConfig.addCustomizer() 有帮助,现在我看到了 SSL 属性,谢谢!

以上是关于如何通过 ALPN 在 Jetty SPDY 上使用客户端证书?的主要内容,如果未能解决你的问题,请参考以下文章

ALPN 回调被丢弃:SPDY 和 HTTP/2 被禁用。 alpn-boot 在引导类路径上吗?

Jetty:可以使用 SPDY/3.1 吗?

如何在 JDK8 上使用 SPDY 运行 Jetty?

Jetty 9.0 嵌入了带有 SPDY 但没有 SSL/NPN 的配置

ClassNotFoundException: org/eclipse/jetty/alpn/ALPN,但我可以访问这个类

如何使我的 Web 应用程序与 SPDY、Jetty 一起工作 [关闭]