我正在使用客户端库来获取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错误。
所以我的问题: