使用 vertx HttpClient 连接到 https url 时 vertx ssl 握手失败
vertx ssl handshake failure while connecting to https url using vertx HttpClient
当我尝试连接 https url...我遇到 ssl 握手失败...
我正在使用 vertx-version >>2.1.5
请帮我解决这个问题...我被困在这里这对我来说非常重要
This code is working fine, giving me proper response..
URL url = new URL("https://bugzilla.mozilla.org/rest/bug/707428/comment");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("GET");
conn.setRequestProperty("accept", "application/json");
InputStream is=conn.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
String str=null;
while((str=br.readLine())!=null){
System.out.println(str);
}
conn.disconnect();
但是在使用顶点时。手抖问题
HttpClient client = MyServer.defaultVertx.createHttpClient().setSSL(true).setTrustAll(true)
.setHost("bugzilla.mozilla.org").setPort(443).setVerifyHost(false);
HttpClientRequest request= client.request("GET","/rest/bug/707428/comment",new Handler<HttpClientResponse>() {
@Override
public void handle(HttpClientResponse cRes) {
System.out.println(" HttpClientResponse Done.."+cRes);
cRes.bodyHandler(new Handler<Buffer>() {
@Override
public void handle(Buffer data) {
System.out.println("Response (" + data.length() + "): ");
System.out.println("Response >>" +data.getString(0, data.length()));
}
});
cRes.dataHandler(new Handler<Buffer>() {
@Override
public void handle(Buffer data) {
System.out.println("data Handler (" + data.length() + "): ");
System.out.println("data Handler<>> "+data.getString(0, data.length()));
}
});
cRes.exceptionHandler(new Handler<Throwable>() {
@Override
public void handle(Throwable arg0) {
arg0.printStackTrace();
}
});
}
});
request.exceptionHandler(new Handler<Throwable>() {
@Override
public void handle(Throwable arg0) {
// TODO Auto-generated method stub
arg0.printStackTrace();
}
});
request.end();
client.close();
javax.net.ssl.SSLException: Received fatal alert: handshake_failure
at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1619)
at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1587)
at sun.security.ssl.SSLEngineImpl.recvAlert(SSLEngineImpl.java:1756)
at sun.security.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:1060)
at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:884)
at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:758)
at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624)
at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1001)
at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:927)
at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:873)
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:241)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:149)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:787)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:125)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)
at io.netty.util.concurrent.SingleThreadEventExecutor.run(SingleThreadEventExecutor.java:116)
at java.lang.Thread.run(Thread.java:745)
代码示例连接到端口 433,而 HTTPS 正在侦听 443。
我猜这是你问题中的错字,否则你不会得到 SSL 握手失败。
您的代码看起来不错,它甚至应该能够处理自签名的 SSL 证书。
我怀疑这是 bugzilla.mozilla.org 的特定 SSL 设置与 Vert.x 2 中的 HTTP 客户端实现相结合的问题。您可以通过访问另一台主机 (https://google.com,例如)。
一个可能的原因可能是 mozilla.org 上的 SSL 设置需要 SNI(服务器名称指示),并且 Vert.x HTTPClient 默认情况下不发送它。
很难查明此异常的确切问题。
可能是密码不兼容、JCE 策略 jar 丢失、SSL 版本问题等。
我建议启用连接相关问题的调试以查看到底出了什么问题。
-Djavax.net.debug=全部
参考这个link moreinfo
当我尝试连接 https url...我遇到 ssl 握手失败... 我正在使用 vertx-version >>2.1.5 请帮我解决这个问题...我被困在这里这对我来说非常重要
This code is working fine, giving me proper response..
URL url = new URL("https://bugzilla.mozilla.org/rest/bug/707428/comment");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("GET");
conn.setRequestProperty("accept", "application/json");
InputStream is=conn.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
String str=null;
while((str=br.readLine())!=null){
System.out.println(str);
}
conn.disconnect();
但是在使用顶点时。手抖问题
HttpClient client = MyServer.defaultVertx.createHttpClient().setSSL(true).setTrustAll(true)
.setHost("bugzilla.mozilla.org").setPort(443).setVerifyHost(false);
HttpClientRequest request= client.request("GET","/rest/bug/707428/comment",new Handler<HttpClientResponse>() {
@Override
public void handle(HttpClientResponse cRes) {
System.out.println(" HttpClientResponse Done.."+cRes);
cRes.bodyHandler(new Handler<Buffer>() {
@Override
public void handle(Buffer data) {
System.out.println("Response (" + data.length() + "): ");
System.out.println("Response >>" +data.getString(0, data.length()));
}
});
cRes.dataHandler(new Handler<Buffer>() {
@Override
public void handle(Buffer data) {
System.out.println("data Handler (" + data.length() + "): ");
System.out.println("data Handler<>> "+data.getString(0, data.length()));
}
});
cRes.exceptionHandler(new Handler<Throwable>() {
@Override
public void handle(Throwable arg0) {
arg0.printStackTrace();
}
});
}
});
request.exceptionHandler(new Handler<Throwable>() {
@Override
public void handle(Throwable arg0) {
// TODO Auto-generated method stub
arg0.printStackTrace();
}
});
request.end();
client.close();
javax.net.ssl.SSLException: Received fatal alert: handshake_failure
at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1619)
at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1587)
at sun.security.ssl.SSLEngineImpl.recvAlert(SSLEngineImpl.java:1756)
at sun.security.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:1060)
at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:884)
at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:758)
at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624)
at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1001)
at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:927)
at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:873)
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:241)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:149)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:787)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:125)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)
at io.netty.util.concurrent.SingleThreadEventExecutor.run(SingleThreadEventExecutor.java:116)
at java.lang.Thread.run(Thread.java:745)
代码示例连接到端口 433,而 HTTPS 正在侦听 443。 我猜这是你问题中的错字,否则你不会得到 SSL 握手失败。
您的代码看起来不错,它甚至应该能够处理自签名的 SSL 证书。 我怀疑这是 bugzilla.mozilla.org 的特定 SSL 设置与 Vert.x 2 中的 HTTP 客户端实现相结合的问题。您可以通过访问另一台主机 (https://google.com,例如)。
一个可能的原因可能是 mozilla.org 上的 SSL 设置需要 SNI(服务器名称指示),并且 Vert.x HTTPClient 默认情况下不发送它。
很难查明此异常的确切问题。
可能是密码不兼容、JCE 策略 jar 丢失、SSL 版本问题等。
我建议启用连接相关问题的调试以查看到底出了什么问题。
-Djavax.net.debug=全部
参考这个link moreinfo