Aviso sobre conexão SSL ao conectar ao banco de dados MySQL

312

Com as duas classes abaixo, tentei conectar-me a um banco de dados MySQL. No entanto, eu sempre recebo este erro:

Qua 09 de dezembro 22:46:52 CET 2015 AVISO: O estabelecimento de uma conexão SSL sem a verificação de identidade do servidor não é recomendado. De acordo com os requisitos do MySQL 5.5.45+, 5.6.26+ e 5.7.6+, a conexão SSL deve ser estabelecida por padrão se a opção explícita não estiver configurada. Para conformidade com aplicativos existentes que não usam SSL, a propriedade confirmServerCertificate está configurada como 'false'. Você precisa desativar explicitamente o SSL configurando useSSL = false ou definir useSSL = true e fornecer armazenamento confiável para verificação de certificado do servidor.

Esta é a classe de teste com o mainmétodo:

public class TestDatabase {

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

Esta é a 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();
            }
        }
    }
}
Milos86
fonte
2
Obrigado pela resposta, tudo bem, eu simplesmente não sabia que eu precisava colocar ssl = true ou false no final do meu String connectionURL.
Milos86
obrigado, então como é o novo connectionURL?
user3290180
4
Não é um erro, é um aviso.
Fernando Silveira

Respostas:

577

O URL da sua conexão deve se parecer com o abaixo,

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

Isso desativará o SSL e também suprimirá os erros de SSL.

Priyank Gosalia
fonte
41
na seqüência de conexão JDBC é não deve terminar com ponto e vírgula
Amith
8
no arquivo de contexto do tomcat jdbc: mysql: // localhost: 3306 / databaseName? autoReconnect = true; useSSL = false;
Amith 11/02/16
27
A confusão com ponto-e-vírgula é possivelmente devida ao fato de que na configuração XML você deve tê-la como? AutoReconnect = true & useSSL = false. Caso contrário, o analisador acha que você tem alguma entidade estranha com a qual você deve terminar ';'
Bostone 29/07
25
Eu tive o mesmo problema no hibernate, mas resolvi pelo URL assim: jdbc:mysql://localhost:3306/Peoples?autoReconnect=true&useSSL=false usei o & amp; em vez de &
Saqib Ahmed
2
@ Roger: existem casos para desativar o SSL se a rede estiver segura. Por exemplo, tenho servidores SQL sendo executados em contêineres acessados ​​apenas por clientes no mesmo hardware físico.
Rodney
131

Que tal usar SSL, mas desativar a verificação do servidor (como no modo de desenvolvimento em seu próprio computador):

jdbc:mysql://localhost:3306/Peoples?verifyServerCertificate=false&useSSL=true
Peter DeGregorio
fonte
Isto é o que eu precisava fazer para conectar-me a um banco de dados MySQL via SSL via IntelliJ / DataGrip
Swaraj
23

Mencione o seguinte url:

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

Mas na configuração xml quando você menciona o &sinal, o IDE mostra abaixo o erro:

A referência à entidade "useSSL" deve terminar com o ';' delimitador.

E então você tem que usar explicitamente o em &vez de &ser determinado como a partir &de xmlentão, xmlvocê deve fornecer o URL na configuração xml como esta:

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

Um método alternativo seria:

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) {
...
}
Jon
fonte
Parece bom, mas como eu faço isso no meu application.yml do meu grails-app?
Fusca Software
12

Também encontrei esse aviso e o corrigi usando o sufixo SSL = false na cadeia de conexão como este código de exemplo.

Exemplo:

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

Os padrões para iniciar uma conexão com um servidor MySQL foram alterados no passado recente e (de uma rápida olhada nas perguntas e respostas mais populares sobre o estouro de pilha), os novos valores estão causando muita confusão. O pior é que o conselho padrão parece ser desativar completamente o SSL, o que é um desastre.

Agora, se sua conexão realmente não é exposta à rede (localhost apenas) ou você está trabalhando em um ambiente de não-produção, sem dados reais, então a certeza: não há nenhum dano na desativação SSL, incluindo a opção useSSL=false.

Para todos os outros, o seguinte conjunto de opções é necessário para que o SSL funcione com a verificação de certificado e host:

  • useSSL = true
  • sslMode = VERIFY_IDENTITY
  • trustCertificateKeyStoreUrl = file: path_to_keystore
  • trustCertificateKeyStorePassword = senha

Como um bônus adicional, como você já está jogando com as opções, é simples desativar também os protocolos SSL fracos:

  • enabledTLSProtocols = TLSv1.2

Exemplo

Portanto, como exemplo de trabalho, você precisará seguir as seguintes etapas gerais:

Primeiro, verifique se você possui um certificado válido gerado para o host do servidor MySQL e se o certificado CA está instalado no host do cliente (se você estiver usando autoassinatura, provavelmente precisará fazer isso manualmente, mas para o CAs públicas populares já estará lá).

Em seguida, verifique se o keystore java contém todos os certificados da CA. No Debian / Ubuntu, isso é conseguido executando:

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

Finalmente, atualize a cadeia de conexão para incluir todas as opções necessárias, que no Debian / Ubuntu seriam algo como (adaptar conforme necessário):

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

Referência: https://beansandanicechianti.blogspot.com/2019/11/mysql-ssl-configuration.html

Buffoonism
fonte
Não é apenas a resposta certa, mas também a mais detalhada e segura. Se você receber um aviso sobre SSL, nunca deverá ignorá-lo (exceto sandbox e instalações locais). Você me indicou a solução certa para um cluster do Kubernetes Keycloack 9.0.2 que se conecta ao MySQL do Azure. Muito obrigado!
iakko 9/04
10

você precisa usar seu caminho mysql assim:

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

Isso foi bom para mim:

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

Use isso para resolver o problema no hive enquanto faz conexão com o 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>
KARTHIKEYAN.A
fonte
Mas por que não leva com o operador e ? Eu tinha algo parecido jdbc:mysql://localhost/metastore?useSSL=false&createDatabaseIfNotExist=true. Sem o e funciona bem.
Kulasangar
para mim, o valor postado funcionou sem problemas, então sinalizarei isso como uma resposta no final de dezembro de 2017 e trabalhando com o hive-2.1.1 hive-site.xml.
ArifMustafa
7

Eu uso essa propriedade para hibernar no config xml

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

sem - serverTimezone = UTC - não funciona

Aliaksandr Kavalenka
fonte
4

Solução Para corrigi-lo, anexe um useSSL = false no final da cadeia de conexão do MySQL:

ex.

application.properties

fonte de dados 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
Pravin
fonte
2

as novas versões do mysql-connector estabelecem conexão SSL por padrão ... para resolvê-lo:

Faça o download da versão mais antiga do mysql-connector, como mysql-connector-java-5.0.8.zip

. . ou . Faça o download do OpenSSL para Windows e siga as instruções de como configurá-lo

Ahmad.ak
fonte
0

Como atualmente estou no modo de desenvolvimento, defino useSSL como No, não no tomcat, mas nas configurações do servidor mysql. Foi gerenciar configurações de acesso \ Gerenciar conexões do servidor no ambiente de trabalho -> Selecionou minha conexão. A guia Conexão interna foi para a guia SSL e desativou as configurações. Trabalhou para mim.

Deepali Maniyar
fonte