AsyncProxyServlet内的Jetty HttpClient不支持SSL吗?

时间:2018-03-22 17:07:52

标签: java ssl jetty embedded-jetty sslcontext

使用jetty 9.4.8.v20171121

上述类的第70行在此代码上抛出一个nullpointer异常:

SSLEngine engine = sslContextFactory.newEngine(host, port);

我已经在这个类的构造函数的第一行设置了一个断点并且从未调用过,所以为什么在没有创建SslContextFactory的情况下调用newConnection,因为在构造函数中它是唯一被设置的位置。 / p>

这是一个代理请求所有主机,端口,密钥都很好。它是从ClientSelectorManager调用的。

此外,这只会出现在调试中,这似乎是一个错误,它不会被抛出错误

堆栈跟踪:  DEBUG org.eclipse.jetty.client.AbstractConnectionPool [] - 连接1/256创建失败

java.lang.NullPointerException: null
at org.eclipse.jetty.io.ssl.SslClientConnectionFactory.newConnection(SslClientConnectionFactory.java:70) ~[jetty-io-9.4.8.v20171121.jar:9.4.8.v20171121]
at org.eclipse.jetty.client.AbstractConnectorHttpClientTransport$ClientSelectorManager.newConnection(AbstractConnectorHttpClientTransport.java:172) ~[?:?]
at org.eclipse.jetty.io.ManagedSelector.createEndPoint(ManagedSelector.java:208) ~[jetty-io-9.4.8.v20171121.jar:9.4.8.v20171121]
at org.eclipse.jetty.io.ManagedSelector.access$1600(ManagedSelector.java:60) ~[jetty-io-9.4.8.v20171121.jar:9.4.8.v20171121]
at org.eclipse.jetty.io.ManagedSelector$CreateEndPoint.run(ManagedSelector.java:650) [jetty-io-9.4.8.v20171121.jar:9.4.8.v20171121]
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:708) [jetty-util-9.4.8.v20171121.jar:9.4.8.v20171121]
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:626) [jetty-util-9.4.8.v20171121.jar:9.4.8.v20171121]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_121]

我认为这里的答案是覆盖newHttpClient()并创建自己的新contextFactory并将其作为构造函数arg传递。

1 个答案:

答案 0 :(得分:0)

你还没有开始HttpClient(又名HttpClient.start()) 或者您没有向SslContextFactory构造函数提供HttpClient

由于你提到newHttpClient()我猜你有ProxyServlet(你在问题中未提及)。

是,默认HttpClient没有SSL上下文或配置。这取决于你定义/提供。

覆盖AbstractProxyServlet.newHttpClient()是合适的。

请参阅默认实施:https://github.com/eclipse/jetty.project/blob/jetty-9.4.9.v20180320/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AbstractProxyServlet.java#L349-L361

你可以逃脱......

package jetty.proxy;

import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.proxy.AsyncProxyServlet;
import org.eclipse.jetty.util.ssl.SslContextFactory;

public class MyProxyServlet extends AsyncProxyServlet
{
    @Override
    protected HttpClient newHttpClient()
    {
        SslContextFactory ssl = new SslContextFactory();
        ssl.setTrustAll(true); // configure ssl (example, not required)
        return new HttpClient(ssl);
    }
}