Главная > Soft > Как разбирать ошибки SSL в Java приложении

Как разбирать ошибки SSL в Java приложении

SSLНедавно пришлось делать миграцию приложения, которое работает через OpenAM, с WAS6 на WAS8. Особенность миграции было изменение версии JDK и сервера, а это могло стать причиной проблем в приложении.

Неприятности не заставили себя ждать. При первом запуске приложения появилась ошибка “Error decrypting SAML message”. Подозрения сразу пали на SSL, но текст ошибки нам ничего не говорил, поэтому пришлось смотреть глубже. Для этого хорошо подходит особый параметр JVM (его нужно прописать в параметрах процесса сервера, используя консоль администратора).

-Djavax.net.debug=ssl:handshake

С его помощью удалось получить больше деталей.

*** ClientHello, SSLv3

main, WRITE: SSLv3 Handshake, length = 81
main, READ: SSLv3 Alert, length = 2
main, RECV TLSv1 ALERT: fatal, handshake_failure

Видно, что ошибка точно в протоколе SSL: сервер использует версию TLSv1, а клиент SSLv3. После этого была попытка связаться с командой OpenAM и попросить их поменять версию, но они отказались, сославшись на устарелость последней. SSLv3 не является уже безопасным и подвержен атаке Padding Oracle On Downgraded Legacy Encryption (POODLE). После этого пришлось искать выход самостоятельно.
Достаточно быстро получилось найти код, который являлся причиной ошибки:

SSLContext sslContext = SSLContext.getInstance(«SSL»);

Он и устанавливал SSLv3. Были испробованы разные варианты «быстрого» решения проблемы, используя инструкцию oracle, но эти варианты не сработали: SSLv3 отключить не получилось.

http://www.oracle.com/technetwork/java/javase/documentation/cve-2014-3566-2342133.html

Тогда была найдена инструкция от IBM.

http://www-01.ibm.com/support/docview.wss?uid=swg21687173

Из неё стало очевидно, что без установки обновления для WAS8 ничего не получится. После обновления сервера  приложение начало работать, но сам сервер стал нестабилен: падали команды ./stopManager.sh, ./syncNode.sh.

Caused by: [SOAPException: faultCode=SOAP-ENV:Client; msg=Error opening socket: java.io.IOException: Exception during sslSocket.startHandshake: Received fatal alert: handshake_failure; targetException=java.lang.IllegalArgumentException: Error opening socket: java.io.IOException: Exception during sslSocket.startHandshake: Received fatal alert: handshake_failure]
at org.apache.soap.transport.http.SOAPHTTPConnection.send(SOAPHTTPConnection.java:475)
at org.apache.soap.rpc.Call.WASinvoke(Call.java:510)
at com.ibm.ws.management.connector.soap.SOAPConnectorClient$4.run(SOAPConnectorClient.java:387)
at com.ibm.ws.security.util.AccessController.doPrivileged(AccessController.java:118)
at com.ibm.ws.management.connector.soap.SOAPConnectorClient.reconnect(SOAPConnectorClient.java:372)
… 41 more

Новая ошибка заставила разбираться дальше, пришлось даже взглянуть на сообщения протокола.

Как разбирать ошибки SSL в Java приложении

Остановка сервера падала на шаге 10, после этого обмен сообщениями прекращался. Сервер не понимал первое зашифрованное сообщение от клиента. Порывшись в логах, получилось вычленить ошибку, которая падала на сервере:

[2/21/15 17:03:54:665 CET] 00000006 SystemOut O LT=1:P=442110:O=0:port=9403, handling exception: javax.net.ssl.SSLHandshakeException: bad record MAC
[2/21/15 17:03:54:666 CET] 00000006 SystemOut O LT=1:P=442110:O=0:port=9403, IOException in getSession(): javax.net.ssl.SSLHandshakeException: bad record MAC

К сожалению, пищи для размышления она не дала. Поэтому пришлось искать в другом направлении при помощи другой утилиты:

openssl s_client –connect localhost:8879 –msg –debug –tlsv1 –cipher SHA -> no error
openssl s_client –connect localhost:8879 –msg –debug –tlsv1 –cipher RSA -> error

При обмене сообщениями сервер и клиент пишут список поддерживаемых алгоритмов. Стало понятно, что некоторые из них стали не поддерживаться. Поэтому через explorer не выходит зайти в приложение, а через chrome можно.

После исключения некоторых ciphers в админ-консоли, получилось все запустить.

SSL_RSA_WITH_RC4_128_MD5,
SSL_RSA_WITH_RC4_128_SHA
SSL_RSA_WITH_AES_128_CBC_SHA.

Выходит, вторая проблема оказалась в алгоритмах шифрования, которые были прописаны в консоли как поддерживаемые, но реально — нет.

Надеюсь, пример использования данных уловок для разбора проблем с SSL в Java будет полезен.

Categories: Soft Tags: , , , ,
  1. Пока что нет комментариев.
  1. Пока что нет уведомлений.