Предупреждение о SSL-соединении при подключении к базе данных MySQL
С двумя нижеприведенными классами я попытался подключиться к базе данных MySQL. Тем не менее, я всегда получаю эту ошибку:
Ср дек 09 22:46:52 CET 2015 ПРЕДУПРЕЖДЕНИЕ. Установление SSL-соединения без проверки подлинности сервера не рекомендуется. В соответствии с требованиями MySQL 5.5.45+, 5.6.26+ и 5.7.6+ SSL-соединение должно быть установлено по умолчанию, если явная опция не установлена. Для соответствия существующим приложениям, не использующим SSL, свойство verifyServerCertificate установлено в значение "false". Вам нужно либо явно отключить SSL, установив useSSL= false, либо установить useSSL= true и предоставить хранилище доверенных сертификатов для проверки сертификата сервера.
Это тестовый класс с main
метод:
public class TestDatabase {
public static void main(String[] args) {
Database db = new Database();
try {
db.connect();
} catch (Exception e) {
e.printStackTrace();
}
db.close();
}
}
Это Database
учебный класс:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Database {
private Connection con;
public void connect() throws Exception{
if(con != null) return;
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
throw new Exception("No database");
}
String connectionURL = "jdbc:mysql://localhost:3306/Peoples";
con = DriverManager.getConnection(connectionURL, "root", "milos23");
}
public void close(){
if(con != null){
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
19 ответов
URL вашего подключения должен выглядеть следующим образом:
jdbc:mysql://localhost:3306/Peoples?autoReconnect=true&useSSL=false
Это отключит SSL, а также подавит ошибки SSL.
Как насчет использования SSL, но при отключении проверки сервера (например, в режиме разработки на вашем компьютере):
jdbc:mysql://localhost:3306/Peoples?verifyServerCertificate=false&useSSL=true
Значения по умолчанию для инициации соединения с сервером MySQL были изменены в недавнем прошлом, и (после беглого просмотра наиболее популярных вопросов и ответов о переполнении стека) новые значения вызывают много путаницы. Что еще хуже, стандартный совет, похоже, заключается в том, чтобы полностью отключить SSL, что является своего рода катастрофой.
Теперь, если ваше соединение действительно не доступно для сети (только localhost) или вы работаете в непроизводственной среде без реальных данных, тогда убедитесь: отключение SSL с помощью параметра useSSL=false
.
Для всех остальных требуется следующий набор параметров, чтобы SSL работал с сертификатом и проверкой хоста:
- useSSL=true
- sslMode=VERIFY_IDENTITY
- trustCertificateKeyStoreUrl=file:path_to_keystore
- trustCertificateKeyStorePassword= пароль
В качестве дополнительного бонуса, поскольку вы уже играете с опциями, просто отключить слабые протоколы SSL:
- enabledTLSProtocols=TLSv1.2
пример
Итак, в качестве рабочего примера вам нужно будет выполнить следующие общие шаги:
Во-первых, убедитесь, что у вас есть действительный сертификат, сгенерированный для хоста сервера MySQL, и что сертификат CA установлен на хосте клиента (если вы используете самоподписанный, вам, вероятно, придется сделать это вручную, но для популярных общедоступных центров сертификации он уже будет там).
Затем убедитесь, что хранилище ключей java содержит все сертификаты CA. В Debian/Ubuntu это достигается запуском:
update-ca-certificates -f
chmod 644 /etc/ssl/certs/java/cacerts
Затем, наконец, обновите строку подключения, чтобы включить все необходимые параметры, которые в Debian/Ubuntu будут немного похожи (при необходимости адаптируйте):
jdbc:mysql://{mysql_server}/confluence?useSSL=true&sslMode=VERIFY_IDENTITY&trustCertificateKeyStoreUrl=file%3A%2Fetc%2Fssl%2Fcerts%2Fjava%2Fcacerts&trustCertificateKeyStorePassword=changeit&enabledTLSProtocols=TLSv1.2&useUnicode=true&characterEncoding=utf8
Ссылка: https://beansandanicechianti.blogspot.com/2019/11/mysql-ssl-configuration.html
Упомянуть url
лайк:
jdbc:mysql://hostname:3306/hibernatedb?autoReconnect=true&useSSL=false
но в конфигурации xml, когда вы упоминаете & подписываете, IDE показывает ниже ошибку:
The reference to entity "useSSL" must end with the ';' delimiter.
а затем вы должны явно использовать &
вместо &
определяется как &
от xml
после этого в xml
Вы должны дать URL-адрес в конфигурации XML, как это:
<property name="connection.url">jdbc:mysql://hostname:3306/hibernatedb?autoReconnect=true&useSSL=false</property>
Альтернативный метод будет:
Properties properties = new Properties();
properties.setProperty("user", "root");
properties.setProperty("password", "milos23);
properties.setProperty("useSSL", "false");
properties.setProperty("autoReconnect", "true");
try (Connection conn = DriverManager.getConnection(connectionUrl, properties)) {
...
} catch (SQLException e) {
...
}
Хотя я не думаю, что настройка автоматического переподключения необходима для удаления предупреждения.
Я также нашел это предупреждение, затем исправил его с помощью суффикса SSL=false к строке подключения, как в примере кода.
Пример:
connectionString = "jdbc:mysql://{server-name}:3306/%s?useUnicode=yes&characterEncoding=UTF-8&useSSL=false"
Используйте это, чтобы решить проблему в улье при установлении соединения с MySQL
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost/metastore?createDatabaseIfNotExist=true&autoReconnect=true&useSSL=false</value>
<description>metadata is stored in a MySQL server</description>
</property>
Вам нужно использовать свой путь mysql следующим образом:
<property name="url" value="jdbc:mysql://localhost:3306/world?useSSL=true"/>
Это было хорошо для меня:
this.conn = (Connection)DriverManager
.getConnection(url + dbName + "?useSSL=false", userName, password);
Чтобы отключить предупреждение при подключении к базе данных на Java, используйте концепцию ниже:
autoReconnect=true&useSSL=false
Просто нужно изменить connectionURL, например:
String connectionURL = jdbc:mysql://localhost:3306/Peoples?autoReconnect=true&useSSL=false
Это отключит SSL, а также подавит ошибки SSL.
Я использую это свойство для спящего режима в конфигурации XML
<property name="hibernate.connection.url">
jdbc:mysql://localhost:3306/bookshop?serverTimezone=UTC&useSSL=false
</property>
без - serverTimezone = UTC - это не работает
Решение Чтобы исправить это, добавьте useSSL=false в конце строки подключения MySQL:
ех.
application.properties
MySQL источник данных
spring.datasource.url=jdbc:mysql://localhost/dbname?useSSL=false
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
Согласно https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-connp-props-security.html,
sslModel
свойство заменяет устаревшие свойства
useSSL
,
requireSSL
, а также
verifyServerCertificate
. Итак, вы можете использовать строку подключения
sslModel=DISABLED
.
Начиная с 8.0.13
useSSL
параметр теперь устарел, и вы должны использовать
sslMode
:
MySQL :: MySQL Connector/J 8.0 Developer Guide :: 6.3.5 Безопасность
sslMode
По умолчанию сетевые подключения шифруются SSL; это свойство позволяет отключить безопасные соединения или выбрать другой уровень безопасности. Допускаются следующие значения: "DISABLED" - устанавливать незашифрованные соединения; «ПРЕДПОЧТИТЕЛЬНЫЙ» — (по умолчанию) устанавливать зашифрованные соединения, если они разрешены сервером, в противном случае вернуться к незашифрованным соединениям; «ТРЕБУЕТСЯ» — установить безопасные соединения, если сервер разрешил их, иначе не получится; «VERIFY_CA» — аналогично «ОБЯЗАТЕЛЬНОМУ», но дополнительно проверяет сертификат TLS сервера по сравнению с настроенными сертификатами центра сертификации (ЦС); «VERIFY_IDENTITY» — аналогично «VERIFY_CA», но дополнительно убедитесь, что сертификат сервера соответствует хосту, к которому осуществляется попытка подключения.
Это свойство заменило устаревшие устаревшие свойства «useSSL», «requireSSL» и «verifyServerCertificate», которые по-прежнему принимаются, но преобразуются в значение для «sslMode», если «sslMode» не задан явно: «useSSL=false» преобразуется в "sslMode=ОТКЛЮЧЕНО";
Неизвестный макрос: {"useSSL=true", "requireSSL=false", "verifyServerCertificate=false"} переводится в "sslMode=PREFERRED";
Неизвестный макрос: {"useSSL=true", "requireSSL=true", "verifyServerCertificate=false"} переводится в "sslMode=REQUIRED";
Неизвестный макрос: {"useSSL=true" AND "verifyServerCertificate=true"} преобразуется в "sslMode=VERIFY_CA". Для «sslMode=VERIFY_IDENTITY» нет эквивалентных устаревших настроек. Обратите внимание, что для ВСЕХ версий сервера настройка по умолчанию «sslMode» — «ПРЕДПОЧТИТЕЛЬНАЯ», и она эквивалентна устаревшим настройкам «useSSL=true», «requireSSL=false» и «verifyServerCertificate=false», которые в некоторых ситуациях отличаются от настроек по умолчанию для Connector/J 8.0.12 и более ранних версий. Приложения, которые продолжают использовать устаревшие свойства и полагаются на свои старые настройки по умолчанию, должны быть проверены.
Унаследованные свойства игнорируются, если «sslMode» задан явно. Если ни одно из значений «sslMode» или «useSSL» не задано явно, применяется значение по умолчанию «sslMode=PREFERRED».
Значение по умолчанию ПРЕДПОЧТИТЕЛЬНО, начиная с версии 8.0.13
Новые версии mysql-connector устанавливают SSL-соединение по умолчанию... для его решения:
Загрузите более старую версию mysql-connector, такую как mysql-connector-java-5.0.8.zip
,, или же., Скачайте OpenSSL для Windows и следуйте инструкциям по его установке
Поскольку я сейчас нахожусь в режиме разработки, я установил для useSSL значение Нет не в tomcat, а в конфигурациях сервера mysql. Перешел в Управление настройками доступа \ Управление подключениями к серверу из рабочей среды -> Выбрал мое подключение. Вкладка "Внутреннее соединение" перешла на вкладку SSL и отключила настройки. Работал у меня.
Если ваше соединение действительно открыто для сети или вы работаете в производственной среде с реальными данными, тогда конечно: мы не должны отключать SSL, включая параметр useSSL=false.
Попробуйте обновить строку подключения JDBC, чтобы включить последнюю версию протокола, как показано ниже: jdbc:mysql://:/?enabledTLSProtocols=TLSv1.2
Мы должны явно указать тип протокола TLS при установке соединения с БД в JDK 11.
Просто используйте независимый от платформы zip или tar https://dev.mysql.com/downloads/connector/j/?os=26.