重试SSL握手错误是否有意义?

时间:2018-04-28 07:36:03

标签: java scala ssl akka-http

我正在使用客户端库来获取REST服务,该服务通过HTTPS协议与服务器通信。 最近有一位客户开始看到以下错误:

Caused by: 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:1666)
    at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1634)
    at sun.security.ssl.SSLEngineImpl.recvAlert(SSLEngineImpl.java:1800)
    at sun.security.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:1083)
    at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:907)
    at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:781)
    at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624)
    at akka.stream.impl.io.TLSActor.akka$stream$impl$io$TLSActor$$doUnwrap(TLSActor.scala:368)
    at akka.stream.impl.io.TLSActor.akka$stream$impl$io$TLSActor$$doInbound(TLSActor.scala:291)
    at akka.stream.impl.io.TLSActor$$anonfun$1.apply$mcV$sp(TLSActor.scala:226)
    at akka.stream.impl.Pump$class.pump(Transfer.scala:200)
    at akka.stream.impl.io.TLSActor.pump(TLSActor.scala:49)
    at akka.stream.impl.BatchingInputBuffer.enqueueInputElement(ActorProcessor.scala:92)
    at akka.stream.impl.BatchingInputBuffer$$anonfun$upstreamRunning$1.applyOrElse(ActorProcessor.scala:143)

这里有一个有趣的问题是,只有0.01%的请求因此错误而失败,并且只针对单个客户。 其他产生类似甚至更高负载的客户从未遇到过SSL错误。

我认为SSL握手错误主要是HTTPS证书或其基础设施的服务器问题。

作为实验,我们为SSLException添加了重试,就像我们重试500/503 HTTP错误导致的异常一样。 使用此版本的客户端所有请求都通过了。我们可以在日志中清楚地看到SSLException数量相同但重试请求成功。

在互联网上搜索显示某些http库会重试其他人不知道的SSL错误。

所以我的问题:

  • 将SSLException添加到我的客户端库中的可退款异常列表中是否有意义?
  • 为什么http库(在我的情况下是akka-http)不会自动重试这些异常,因为它们都会重试TCP错误?

0 个答案:

没有答案