首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSLHandshakeException可以是一个可重试的例外吗?

问SSLHandshakeException可以是一个可重试的例外吗?
EN

Stack Overflow用户
提问于 2018-08-10 14:13:55
回答 1查看 607关注 0票数 0

我有一个服务到服务的连接,是间歇性地从泽西客户端抛出SSLHandshakeExceptions。

代码语言:javascript
复制
public static class MyClientFilter extends ClientFilter{
    @Override
    public ClientResponse handle(ClientRequest cr) throws ClientHandlerException {
        try {
            return getNext().handle(cr);
        } catch (ClientHandlerException e) {
            Throwable rootCause = e.getCause() != null ? e.getCause() : e;
            if (ConnectException.class.isInstance(rootCause) ||
                        SocketException.class.isInstance(rootCause) ||
                        SSLHandshakeException.class.isInstance(rootCause) //maybe?
                ) {
                //do some retry logic
            }
        }
    }
}

它只是间歇性的(很少发生)这一事实告诉我,我的证书和TLS都是正确配置的。在我的客户端,如果连接或套接字异常导致连接失败,我将尝试重试连接。我正在考虑让一个SSLHandshakeException也是一个可重试的例外,因为在我的例子中它似乎应该是,但我想知道一个SSLHandshakeException是否可能是由连接或套接字问题引起的,如果是的话,有什么方法可以判断吗?

更新:

异常的消息似乎表明它可能是一个与SSL配置无关的连接问题:

代码语言:javascript
复制
Caused by: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1002)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1397)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1564)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:347)
at com.sun.jersey.client.urlconnection.URLConnectionClientHandler._invoke(URLConnectionClientHandler.java:249)
at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:149)
... 44 common frames omitted
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-11 12:38:03

SSLHandshakeException可以是一个可重试的例外吗?

还不完全清楚你在问什么:

  • SSLHandshakeException本身是否会重试?不是的。当然不是。
  • 是否允许您在SSLHandshakeException之后重试连接尝试?是的,你可以再试一次。
  • 再试一次好吗?它可能会再次失败,但这取决于是什么导致连接失败。
  • 再试一次好吗?绝对不是那么回事。

实际上,这归结为诊断连接故障的原因。为此,需要启用SSL连接的客户端调试日志记录。

造成这种问题的一个常见原因是客户端和服务器无法协商双方都可以接受的SSL/TLS协议版本或加密套件。这种情况通常发生在一端使用旧的SSL / TLS堆栈时,该堆栈(按当前标准衡量)是不安全的。如果这是根本原因,那么重试也于事无补。

也有可能..。但极不可能..。服务器或网络在错误的时间出现“故障”。

异常的消息似乎表明它可能是一个与SSL配置无关的连接问题。

实际上,我很怀疑。如果协商失败,服务器只关闭连接是一种标准行为;有关详细信息,请参阅RFC 8446 4.1节。客户端会认为这是一个断开的连接。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51788437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档