0

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

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

SSLconnector = new HTTPSPDYServerConnector(server, sslContextFactory);

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

// ... 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});
//...

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

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

4

1 回答 1

1

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

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

只是在做:

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

应该足以解决您的问题。

于 2014-09-22T11:59:09.333 回答