Как работать с клиентскими сертификатами на Jetty SPDY с ALPN?

У меня проблема с сертификатами клиента, когда я использую 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 (см. Мой вопрос Как запустить Jetty с SPDY, используя 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,

Что я должен изменить, чтобы работать с клиентскими сертификатами?

1 ответ

Решение

javax.servlet.request.* свойства, которые вы ищете, установлены Jetty's SecureRequestCustomizer, который нужно добавить в httpConfig объект, который вы создаете в своем примере кода выше.

Я предполагаю, что ваша конфигурация NPN немного отличается, или вы используете какой-то служебный метод в Jetty, который делает это для вас с NPN, но не с ALPN.

Просто делаю:

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

должно быть достаточно, чтобы исправить вашу проблему.

Другие вопросы по тегам