簡體   English   中英

如何使用ALPN在Jetty SPDY上使用客戶端證書?

[英]How to work with client certificates on Jetty SPDY with 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中不是一個選項(請參閱我的問題如何使用ALPN在SPDY上運行Jetty? )。 在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

使用客戶端證書時,我需要更改什么?

您要查找的javax.servlet.request.*屬性是由Jetty的SecureRequestCustomizer設置的,您需要將其添加到在上面的代碼示例中創建的httpConfig對象中。

我猜您的NPN配置略有不同,或者您在Jetty中使用了一些實用程序方法,該方法可以通過NPN而不是ALPN為您完成此操作。

只是做:

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

應該足以解決您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM