Предупреждение о SSL-соединении при подключении к базе данных MySQL


313

С двумя нижеприведенными классами я попытался подключиться к базе данных 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();
            }
        }
    }
}

2
Спасибо за ответ, все в порядке, я просто не знал, что мне нужно поставить ssl = true или false в конце моего String connectionURL.
Milos86

спасибо, так как же это новый connectionURL?
user3290180 15.12.15

4
Это не ошибка, это предупреждение.
Фернандо Сильвейра,

Ответы:


578

URL вашего подключения должен выглядеть следующим образом:

jdbc:mysql://localhost:3306/Peoples?autoReconnect=true&useSSL=false

Это отключит SSL, а также подавит ошибки SSL.


41
в jdbc строка подключения НЕ ДОЛЖНА заканчиваться
точкой с запятой

8
в файле контекста tomcat jdbc: mysql: // localhost: 3306 / databaseName? autoReconnect = true; useSSL = false;
Амит

27
Путаница с точкой с запятой, возможно, связана с тем, что в конфигурации XML вам нужно иметь его как? AutoReconnect = true & amp; useSSL = false. В противном случае синтаксический анализатор думает, что у вас есть какая-то странная сущность, с которой вы должны заканчивать ';'
Бостоне

25
У меня была такая же проблема в спящем режиме, но она была решена по URL-адресу, например: jdbc:mysql://localhost:3306/Peoples?autoReconnect=true&useSSL=false Я использовал & amp; вместо &
Сакиб Ахмед

2
@ Rogerthat есть случаи отключения SSL, если сеть безопасна. Например, у меня есть SQL-серверы, работающие в контейнерах, доступ к которым имеют клиенты только на одном физическом оборудовании.
Родни

131

Как насчет использования SSL, но при отключении проверки сервера (например, в режиме разработки на вашем компьютере):

jdbc:mysql://localhost:3306/Peoples?verifyServerCertificate=false&useSSL=true

Это то , что мне нужно сделать , чтобы подключиться к базе данных MySQL через SSL с помощью IntelliJ / DataGrip
Swaraj

23

Упомяните urlподобное:

jdbc:mysql://hostname:3306/hibernatedb?autoReconnect=true&useSSL=false

Но в конфигурации XML, когда вы упоминаете &знак, IDE показывает ниже ошибку:

Ссылка на сущность "useSSL" должна заканчиваться символом ';' разделитель.

И тогда вы должны явно использовать &вместо , &чтобы определить , как &на xmlдальнейшем в xmlвас , чтобы дать URL в конфигурации XML , как это:

<property name="connection.url">jdbc:mysql://hostname:3306/hibernatedb?autoReconnect=true&amp;useSSL=false</property>

22

Альтернативный метод будет:

Properties properties = new Properties();
properties.setProperty("user", "root");
properties.setProperty("password", "milos23);
properties.setProperty("useSSL", "false");

try (Connection conn = DriverManager.getConnection(connectionUrl, properties)) {
...
} catch (SQLException e) {
...
}

Звучит хорошо, но как я могу получить это в моем application.yml моего grails-приложения?
Fusca Software

12

Я также нашел это предупреждение, затем исправил его с помощью суффикса SSL = false к строке подключения, как в примере кода.

Пример:

connectionString = "jdbc:mysql://{server-name}:3306/%s?useUnicode=yes&characterEncoding=UTF-8&useSSL=false"

11

Значения по умолчанию для инициирования соединения с сервером MySQL были изменены в недавнем прошлом, и (из быстрого просмотра самых популярных вопросов и ответов о переполнении стека) новые значения вызывают много путаницы. Хуже всего то, что стандартный совет, по-видимому, заключается в том, чтобы вообще отключить SSL, что создает некоторую катастрофу.

Теперь, если ваше соединение действительно не открыто для сети (только на локальном хосте) или вы работаете в непроизводственной среде без реальных данных, тогда будьте уверены: отключение SSL не повредит включением этой опции useSSL=false.

Для всех остальных требуется следующий набор параметров для работы SSL с сертификатом и проверкой хоста:

  • UseSSL = TRUE
  • sslMode = VERIFY_IDENTITY
  • trustCertificateKeyStoreUrl = Файл: 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


Это не только правильный ответ, но и самый подробный и безопасный. Если вы получаете предупреждение о SSL, вы никогда не должны пропускать его (кроме песочницы и локальных установок). Вы указали мне на правильное решение для кластера Kubernetes Keycloack 9.0.2, подключающегося к Azure MySQL. Большое спасибо!
iakko

10

вам нужно использовать свой путь mysql следующим образом:

<property name="url" value="jdbc:mysql://localhost:3306/world?useSSL=true"/>

9

Это было хорошо для меня:

this.conn = (Connection)DriverManager
    .getConnection(url + dbName + "?useSSL=false", userName, password);

9

Используйте это, чтобы решить проблему в улье при установлении соединения с MySQL

<property>
   <name>javax.jdo.option.ConnectionURL</name>
   <value>jdbc:mysql://localhost/metastore?createDatabaseIfNotExist=true&amp;autoReconnect=true&amp;useSSL=false</value>
   <description>metadata is stored in a MySQL server</description>
</property>

Но почему она не принимает с и оператором? У меня было что-то подобное jdbc:mysql://localhost/metastore?useSSL=false&createDatabaseIfNotExist=true. Без и работает нормально.
Куласангар

для меня опубликованное значение работало гладко, поэтому я буду отмечать это как ответ в конце декабря месяца 2017 года и работать с hive-2.1.1 hive-site.xml.
ArifMustafa

7

Я использую это свойство для спящего режима в конфигурации XML

<property name="hibernate.connection.url">
jdbc:mysql://localhost:3306/bookshop?serverTimezone=UTC&amp;useSSL=false
</property>

без - serverTimezone = UTC - это не работает


4

Решение Чтобы исправить это, добавьте 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

2

новые версии mysql-connector устанавливают SSL-соединение по умолчанию ... для его решения:

Загрузите более старую версию mysql-connector, такую ​​как mysql-connector-java-5.0.8.zip

, , или . , Скачайте OpenSSL для Windows и следуйте инструкциям по его установке


0

Поскольку я в настоящее время нахожусь в режиме разработки, я установил для useSSL значение «Нет» не в tomcat, а в конфигурациях сервера mysql. Пошел в Управление настройками доступа \ Управление подключениями к серверу из рабочей среды -> Выбрал мое соединение. Внутри вкладки подключения перешли на вкладку SSL и отключили настройки. Работал на меня.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.