Доступ к RDS с помощью SSL — неподдерживаемая версия записи Unknown-0.0

Я использую Amazon RDS MySQL и подключаюсь с сертификатом SSL (сертификат по умолчанию доступен по адресу http://s3.amazonaws.com/rds-downloads/mysql-ssl-ca-cert.pem), я делаю следующие шаги:

  1. Скачал mysql-ssl-ca-cert.pem
  2. Изменил вышеуказанный файл в формате JKS
  3. А подключаясь из веб-приложения через Spring - Hibernate шаблон (org.springframework.beans.factory.config.PropertyPlaceholderConfigurer) и также используя c3p0, мы устанавливаем дополнительный параметр URL как jdbc:URL/DB?autoReconnect=true&useUniCode=true&characterEncoding=UTF-8&useSSL=true&verifyServerCertificate=false&requireSSL=true

Но я столкнулся с проблемой ниже...

javax.net.ssl.SSLException: Unsupported record version Unknown-0.0

Как я могу это исправить?


person R.G.Karthic Balaji    schedule 20.11.2012    source источник


Ответы (2)


В основном это означает, что синтаксический анализатор SSL потерян. Уровень сокетов передал ему несколько байтов, которые не соответствуют протоколу SSL.

Когда вы передаете с использованием сокета SSL, он вызывает процедуру форматирования и шифрования для создания зашифрованного пакета. Затем он вызывает уровень простых сокетов для передачи зашифрованного пакета на сервер. Уровень сокетов сервера получает пакет, а затем вызывает пакет SSL для расшифровки пакета. Если пакет не соответствует формату SSL, вы получаете исключение неподдерживаемой версии.

Все байты, поступающие на уровень сокетов, отправляются в пакет SSL. Таким образом, самый простой способ получить эту ошибку — использовать уровень простых сокетов для передачи простого текстового сообщения после установления соединения SSL.

В моем конкретном случае я столкнулся с этим сообщением об ошибке, потому что я передавал лишние байты. Посмотрим, смогу ли я ясно объяснить свою ошибку.

У меня был буфер размером (например) 100 байт. Я упаковал буфер своим 50-байтовым сообщением и вызвал процедуру шифрования SSL. Результирующий пакет имел длину 75 байт. Я вызвал send() для передачи буфера. Это была простая отправка сокетов; он сделал то, что я ему сказал, то есть передал весь 100-байтовый буфер.

На сервере были получены все 100 байт. Пакет SSL попытался расшифровать пакет. Он обнаружил прекрасное SSL-сообщение, упакованное в первые 75 полученных байтов. Все идет нормально. Затем он попытался выяснить, что означают оставшиеся 25 байтов. Он предположил, что это было ВТОРОЕ сообщение SSL, и попытался его расшифровать. Вот когда он задохнулся и выкинул это неприятное исключение.

Я надеюсь, что это дало вам некоторые подсказки о том, что искать в вашем коде.

person user1965077    schedule 09.01.2013

Я нашел эту ошибку, если представил неподдерживаемый сертификат клиента. Удаление «-Djavax.net.ssl.keyStore» и подключение без клиентского сертификата сработало.

См. также http://feed.askmaclean.com/archives/secure-java-connections-by-default.html :

Поддержка различных версий TLS зависит от используемой версии JRE. Убедитесь, что вы знаете возможности JDK, который вы используете, прежде чем ограничивать определенные версии TLS. При первом запуске приведенного выше теста Eclipse использовал JRE 1.6.0_45 вместо ожидаемой JRE 1.8.0_65 и подключался с использованием шифров TLSv1.0. Когда сервер MySQL был настроен на разрешение только TLSv1.1 и TLSv1.2, я получил следующее исключение:

Вызвано: javax.net.ssl.SSLException: неподдерживаемая версия записи Unknown-0.0 в com.sun.net.ssl.internal.ssl.InputRecord.readV3Record(InputRecord.java:504)

Перед отключением TLSv1.0 следует оценить использование старых JRE — к счастью, PERFORMANCE_SCHEMA позволяет легко исследовать клиентские JRE без необходимости проверять каждый сервер приложений.

person Rich    schedule 04.07.2016