Я работаю над клиентской библиотекой для службы 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.
Используя эту версию клиента все запросы прошли. Мы можем ясно увидеть в журналах, что было одинаковое количество исключений SSLEx, но при повторных запросах было успешно.
Поиск в Интернете показывает, что некоторые http-библиотеки повторяют ошибки SSL, другие не делают.
Итак, мои вопросы:
- Имеет ли смысл добавлять SSLException в список исключений, которые могут быть исключены из моей клиентской библиотеки?
- Почему библиотеки http (в моем случае akka-http) не повторяют автоматически при таких исключениях, поскольку все они имеют повторные попытки для ошибок TCP?