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

时间:2014-09-22 10:44:14

标签: java ssl jetty spdy alpn

当我使用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相关的null时,我得到javax.servlet.request.*。其baseRequest.getHttpChannel()org.eclipse.jetty.server.HttpConnection$HttpChannelOverHttp

我必须更改以使用客户端证书吗?

1 个答案:

答案 0 :(得分:1)

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

我猜你的NPN配置略有不同,或者你在Jetty中使用了一些实用方法,它可以为你做NPN而不是ALPN。

正好:

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

应足以解决您的问题。