AsyncProxyServlet 中的 Jetty HttpClient 不支持 SSL?
Jetty HttpClient inside of AsyncProxyServlet doesn't support SSL?
使用码头 9.4.8.v20171121
上面的第 70 行 class 在此代码上抛出空指针异常:
SSLEngine engine = sslContextFactory.newEngine(host, port);
我已经在这个 class 的构造函数的第一行设置了一个断点并且它从未被调用过,那么为什么在没有首先创建 SslContextFactory 的情况下调用 newConnection 因为在构造函数中是它唯一的地方正在设置。
这是一个代理请求,所有主机、端口、密钥都很好。它是从 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.access00(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.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 传递。
你要么还没有开始 HttpClient
(又名 HttpClient.start()
)
或者您没有向 HttpClient
构造函数提供 SslContextFactory
。
既然你提到了 newHttpClient()
,我猜你有 ProxyServlet
(你在问题中没有提到)。
是的,默认 HttpClient
没有 SSL 上下文或配置。 define/provide.
由你决定
覆盖 AbstractProxyServlet.newHttpClient()
是合适的。
您只需...
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);
}
}
使用码头 9.4.8.v20171121
上面的第 70 行 class 在此代码上抛出空指针异常:
SSLEngine engine = sslContextFactory.newEngine(host, port);
我已经在这个 class 的构造函数的第一行设置了一个断点并且它从未被调用过,那么为什么在没有首先创建 SslContextFactory 的情况下调用 newConnection 因为在构造函数中是它唯一的地方正在设置。
这是一个代理请求,所有主机、端口、密钥都很好。它是从 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.access00(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.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 传递。
你要么还没有开始 HttpClient
(又名 HttpClient.start()
)
或者您没有向 HttpClient
构造函数提供 SslContextFactory
。
既然你提到了 newHttpClient()
,我猜你有 ProxyServlet
(你在问题中没有提到)。
是的,默认 HttpClient
没有 SSL 上下文或配置。 define/provide.
覆盖 AbstractProxyServlet.newHttpClient()
是合适的。
您只需...
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);
}
}