Попередження про з'єднання SSL під час підключення до бази даних MySQL


312

За допомогою двох нижче класів я намагався підключитися до бази даних MySQL. Однак я завжди отримую цю помилку:

Ср. Груд. 09 22:46:52 CET 2015 ПОПЕРЕДЖЕННЯ: Встановлення з’єднання SSL без підтвердження ідентичності сервера не рекомендується. Відповідно до вимог MySQL 5.5.45+, 5.6.26+ та 5.7.6+ і з’єднанням SSL повинно бути встановлено за замовчуванням, якщо явна опція не встановлена. Для відповідності існуючим програмам, які не використовують SSL, властивість veriServerCertificate встановлено як "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 на кінець мого струнного з'єднанняURL.
Milos86

дякую, так як це нове з'єднанняURL?
user3290180

4
Це не помилка, це попередження.
Фернандо Сільвейра

Відповіді:


577

Ваша 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
@Rogert що є випадки відключення 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 = хибний суфікс до рядка з'єднання, як цей приклад коду.

Приклад:

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

11

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

Тепер, якщо ваше з'єднання справді не піддається впливу мережі (лише локальний хост) або ви працюєте у невиробничому середовищі, де немає реальних даних, тоді впевнено: немає жодної шкоди для відключення SSL, включивши цю опцію useSSL=false.

Для всіх інших потрібен наступний набір параметрів, щоб SSL працював із підтвердженням сертифіката та хоста:

  • useSSL = вірно
  • sslMode = VERIFY_IDENTITY
  • trustCertificateKeyStoreUrl = файл: path_to_keystore
  • trustCertificateKeyStorePassword = пароль

В якості додаткового бонусу, оскільки ви вже граєте з параметрами, легко відключити слабкі протоколи SSL:

  • включеноTLSProtocols = 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 року та роботі з вуликом-2.1.1 вуликом-site.xml.
АріфМустафа

7

Я використовую цю властивість для сплячки у config xml

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

без - serverTimezone = UTC - він не працює


4

Рішення Щоб виправити це, додайте useSSL = false в кінці рядка з'єднання MySQL:

колишній

застосування.властивості

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-з'єднувача встановлюють SSL-з'єднання за замовчуванням ... щоб вирішити це:

Завантажте старішу версію mysql-роз'єму, наприклад, mysql-connector-java-5.0.8.zip

. . або. . Завантажте OpenSSL для Windows та дотримуйтесь інструкцій, як його встановити


0

Оскільки я зараз перебуваю в режимі розробки, я встановив useSSL на No не в tomcat, а в конфігураціях сервера mysql. Перейшов до керування налаштуваннями доступу \ Керування підключеннями до сервера з верстака -> Вибране моє з'єднання. Всередині вкладки підключення перейшло на вкладку SSL та відключено налаштування. Працювали для мене.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.