socket - Ошибка JDBC для SQL Server в Java 8: драйверу не удалось установить безопасное соединение с SQL Server с использованием шифрования SSL.




sql server socket timeout (5)

Microsoft недавно открыла исходный код своего драйвера. На GitHub можно увидеть mssql-jdbc драйвера mssql-jdbc . Я предполагаю, что последняя предварительная версия 6.1.5.

Также вы можете найти все предварительные версии на Maven тоже. Поддержка как JDK7, так и JDK 8.

Я получаю следующую ошибку при подключении к базе данных SQL Server с использованием версии драйвера JDBC Microsoft:

com.microsoft.sqlserver.jdbc.SQLServerException: драйверу не удалось установить безопасное соединение с SQL Server с использованием шифрования SSL. Ошибка: «SQL Server возвратил неполный ответ. Соединение было закрыто. ClientConnectionId: 98d0b6f4-f3ca-4683-939e-7c0a0fca5931».

Недавно мы обновили наши приложения с Java 6 и Java 7 до Java 8. Все системы, работающие на Java, работают под управлением SUSE Linux Enterprise Server 11 (x86_64), VERSION = 11, PATCHLEVEL = 3.

Вот факты, которые я собрал с помощью написанной мной Java-программы, которая просто последовательно открывает и закрывает 1000 подключений к базе данных.

  • Соединения сбрасываются с этой ошибкой примерно 5% -10% времени. Ошибка НЕ ​​возникает на каждом соединении.
  • Проблема возникает ТОЛЬКО с Java 8. Я запустил ту же программу на Java 7, и проблема не воспроизводима. Это согласуется с нашим опытом производства до модернизации. У нас было ноль проблем с запуском Java 7 на производстве.
  • Проблема НЕ возникает на всех наших серверах Linux, работающих под управлением Java 8, она возникает только на некоторых из них. Это вызывает недоумение, но когда я запускаю одну и ту же тестовую программу на одной и той же версии Linux JVM (1.8.0_60, 64-битная) на разных экземплярах Linux, проблема не возникает ни на одном из экземпляров Linux, но проблема действительно происходит на других. Экземпляры Linux работают под одной и той же версией SUSE и находятся на одном уровне исправлений.
  • Проблема возникает при подключении к ОБА SQL Server 2008 и SQL Server 2014 серверов / баз данных.
  • Проблема возникает независимо от того, использую ли я версию 4.0 драйвера JDBC для SQL Server или более новую версию драйвера 4.1.

Что делает мои наблюдения уникальными в этом отношении по сравнению с другими в сети, так это то, что, хотя проблема возникает ТОЛЬКО на Java 8, я не могу получить проблему на одном из, казалось бы, идентичных серверов Linux, на котором установлена ​​та же Java 8 JVM. Другие люди видели эту проблему и в более ранних версиях Java, но это не наш опыт.

Будем благодарны за любые комментарии, предложения или замечания.


В моем случае у меня был sql-сервер, использующий алгоритм 3DES_EDE_CBC, по умолчанию это отключено на jdk 1.8, поэтому проверка

/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/jre/lib/security/java.security

И исключая алгоритм из:

jdk.tls.disabledAlgorithms = SSLv3, RC4, DES, MD5withRSA, размер ключа DH <1024, размер ключа EC <224, 3DES_EDE_CBC, anon, NULL

Работал на меня.


Перед обновлением драйвера JDBC для SQL сначала проверьте совместимость:

  • Sqljdbc.jar требует JRE 5 и поддерживает API JDBC 3.0
  • Sqljdbc4.jar требует JRE 6 и поддерживает API JDBC 4.0
  • Sqljdbc41.jar требует JRE 7 и поддерживает API JDBC 4.1
  • Sqljdbc42.jar требует JRE 8 и поддерживает API JDBC 4.2

Источник: https://www.microsoft.com/en-us/download/details.aspx?id=11774


Похоже, что это было исправлено в версии 4.2 драйвера MS SQL JDBC. Я создал программу, в которой я подключался к серверу 1000 раз, делая паузу в 100 мс между каждой попыткой. С версией 4.1 мне удавалось воспроизвести проблему каждый раз, хотя это происходило лишь время от времени. С версией 4.2 мне не удалось воспроизвести проблему.


Я также сталкивался с этой проблемой в Windows Server 2012 R2, используя драйвер JDBC 4.0 и 4.1 с Java 7. В этой статье Microsoft обвиняют в шифровании DHE и рекомендует отключить их или уменьшить их приоритет, если вы не можете выполнить обновление до драйвера JDBC 4.2.





jdbc