Avertissement sur la connexion SSL lors de la connexion à la base de données MySQL


313

Avec les deux classes ci-dessous, j'ai essayé de me connecter à une base de données MySQL. Cependant, j'obtiens toujours cette erreur:

Wed Dec 09 22:46:52 CET 2015 AVERTISSEMENT: L'établissement d'une connexion SSL sans vérification d'identité du serveur n'est pas recommandé. Selon MySQL 5.5.45+, 5.6.26+ et 5.7.6+, la connexion SSL doit être établie par défaut si l'option explicite n'est pas définie. Pour la conformité avec les applications existantes n'utilisant pas SSL, la propriété verifyServerCertificate est définie sur «false». Vous devez soit désactiver explicitement SSL en définissant useSSL = false, soit définir useSSL = true et fournir un fichier de clés certifiées pour la vérification du certificat du serveur.

C'est la classe de test avec la mainméthode:

public class TestDatabase {

    public static void main(String[] args) {
        Database db = new Database();
        try {
            db.connect();
        } catch (Exception e) {
            e.printStackTrace();
        }
        db.close();
    }
}

Voici la Databaseclasse:

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
Merci pour la réponse, c'est ok, je ne savais pas que je devais mettre ssl = true ou false à la fin de ma chaîne connectionURL.
Milos86

merci, alors comment est-ce la nouvelle connectionURL?
user3290180

4
Ce n'est pas une erreur, c'est un avertissement.
Fernando Silveira

Réponses:


578

L'URL de votre connexion doit ressembler à ce qui suit,

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

Cela désactivera SSL et supprimera également les erreurs SSL.


41
dans la chaîne de connexion jdbc NE DEVRAIT PAS se terminer par un point
Amith

8
dans le fichier de contexte tomcat jdbc: mysql: // localhost: 3306 / databaseName? autoReconnect = true; useSSL = false;
Amith

27
La confusion avec le point-virgule est probablement due au fait que dans la configuration XML, vous devez l'avoir comme? AutoReconnect = true & amp; useSSL = false. Sinon, l'analyseur pense que vous avez une entité étrange avec laquelle vous devez vous terminer ';'
Bostone

25
J'ai eu le même problème en veille prolongée, mais résolu par URL comme ceci: jdbc:mysql://localhost:3306/Peoples?autoReconnect=true&useSSL=false j'ai utilisé & amp; au lieu de &
Saqib Ahmed

2
@Rogert qu'il existe des cas pour désactiver SSL si le réseau est sécurisé. Par exemple, j'ai des serveurs SQL exécutés dans des conteneurs accessibles uniquement par les clients sur le même matériel physique.
Rodney

131

Que diriez-vous d'utiliser SSL mais de désactiver la vérification du serveur (comme en mode de développement sur votre propre ordinateur):

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

C'est ce que je devais faire pour me connecter à une base de données MySQL via SSL via IntelliJ / DataGrip
Swaraj

23

Mentionnez les urlsimilaires:

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

Mais dans la configuration xml lorsque vous mentionnez &signe, l'IDE affiche l'erreur ci-dessous:

La référence à l'entité "useSSL" doit se terminer par le ";" délimiteur.

Et puis vous devez utiliser explicitement le &au lieu d' &être déterminé comme &par la xmlsuite dans xmlvous devez donner l'url dans la configuration xml comme ceci:

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

22

Une autre méthode serait:

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) {
...
}

Cela semble bien, mais comment j'intègre ceci dans mon application.yml de mon application Grails?
Fusca Software

12

J'ai également trouvé cet avertissement, puis je l'ai corrigé en utilisant SSL = faux suffixe à la chaîne de connexion comme cet exemple de code.

Exemple:

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

11

Les valeurs par défaut pour établir une connexion à un serveur MySQL ont été modifiées récemment et (d'un rapide coup d'œil aux questions et réponses les plus populaires sur le débordement de pile), les nouvelles valeurs causent beaucoup de confusion. Le pire est que le conseil standard semble être de désactiver complètement SSL, ce qui est un peu désastreux.

Maintenant, si votre connexion n'est vraiment pas exposée au réseau (localhost uniquement) ou si vous travaillez dans un environnement de non-production sans données réelles, alors assurez-vous: il n'y a aucun mal à désactiver SSL en incluant l'option useSSL=false .

Pour tout le monde, les options suivantes sont requises pour que SSL fonctionne avec la vérification des certificats et des hôtes:

  • useSSL = true
  • sslMode = VERIFY_IDENTITY
  • trustCertificateKeyStoreUrl = fichier: path_to_keystore
  • trustCertificateKeyStorePassword = mot de passe

En prime, vu que vous jouez déjà avec les options, il est également simple de désactiver les protocoles SSL faibles:

  • enabledTLSProtocols = TLSv1.2

Exemple

Donc, comme exemple de travail, vous devrez suivre les grandes étapes suivantes:

Tout d'abord, assurez-vous que vous disposez d'un certificat valide généré pour l'hôte du serveur MySQL et que le certificat CA est installé sur l'hôte client (si vous utilisez l'auto-signature, vous devrez probablement le faire manuellement, mais pour le CA publiques populaires, il sera déjà là).

Ensuite, assurez-vous que le magasin de clés java contient tous les certificats CA. Sur Debian / Ubuntu, ceci est réalisé en exécutant:

update-ca-certificates -f
chmod 644 /etc/ssl/certs/java/cacerts

Enfin, mettez à jour la chaîne de connexion pour inclure toutes les options requises, ce qui, sur Debian / Ubuntu, ressemblerait un peu à (adapter selon les besoins):

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

Référence: https://beansandanicechianti.blogspot.com/2019/11/mysql-ssl-configuration.html


Non seulement c'est la bonne réponse, mais c'est aussi la plus détaillée et la plus sécurisée. Si vous recevez un avertissement sur SSL, vous ne devez jamais l'ignorer (sauf sandbox et installations locales). Vous m'avez indiqué la bonne solution pour un cluster Kubernetes Keycloack 9.0.2 se connectant à Azure MySQL. Merci beaucoup!
iakko

10

vous devez utiliser votre chemin mysql comme ceci:

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

9

C'était bien pour moi:

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

9

Utilisez ceci pour résoudre le problème dans la ruche tout en établissant une connexion avec 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>

Mais pourquoi cela ne prend-il pas avec l' opérateur et ? J'avais quelque chose comme ça jdbc:mysql://localhost/metastore?useSSL=false&createDatabaseIfNotExist=true. Sans le et cela fonctionne bien.
Kulasangar

pour moi, la valeur affichée a bien fonctionné, je vais donc signaler cela comme une réponse à la fin du mois de décembre 2017 et travailler avec hive-2.1.1 hive-site.xml.
ArifMustafa

7

J'utilise cette propriété pour hibernate dans config xml

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

sans - serverTimezone = UTC - cela ne fonctionne pas


4

Solution Pour y remédier, ajoutez un useSSL = false à la fin de la chaîne de connexion MySQL:

ex.

application.properties

source de données 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


0

Étant donné que je suis actuellement en mode développement, j'ai défini useSSL sur Non pas dans tomcat mais dans les configurations de serveur mysql. Je suis allé gérer les paramètres d'accès \ Gérer les connexions au serveur à partir du plan de travail -> J'ai sélectionné ma connexion. L'onglet de connexion interne est allé à l'onglet SSL et a désactivé les paramètres. A travaillé pour moi.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.