Conexão Java-MySql: a recuperação da chave pública não é permitida


104

Tento conectar o banco de dados MySql com Java usando o conector 8.0.11. Tudo parece estar bem, mas eu tenho esta exceção:

Exceção no thread "main" java.sql.SQLNonTransientConnectionException: a recuperação da chave pública não é permitida

Rastreamento de pilha:

    Exception in thread "main" java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:108) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:95) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) at 
 com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:862) at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:444) at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:230) at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:226) at com.mysql.cj.jdbc.MysqlDataSource.getConnection(MysqlDataSource.java:438) at com.mysql.cj.jdbc.MysqlDataSource.getConnection(MysqlDataSource.java:146) at com.mysql.cj.jdbc.MysqlDataSource.getConnection(MysqlDataSource.java:119) at ConnectionManager.getConnection(ConnectionManager.java:28) at Main.main(Main.java:8)

Gerenciador de conectores:

public class ConnectionManager {

    public static final String serverTimeZone = "UTC";
    public static final String serverName = "localhost";
    public static final String databaseName ="biblioteka";
    public static final int portNumber = 3306;
    public static final String user = "anyroot";
    public static final String password = "anyroot";

    public static Connection getConnection() throws SQLException {

        MysqlDataSource dataSource = new MysqlDataSource();

        dataSource.setUseSSL( false );
        dataSource.setServerTimezone( serverTimeZone );
        dataSource.setServerName( serverName );
        dataSource.setDatabaseName( databaseName );
        dataSource.setPortNumber( portNumber );
        dataSource.setUser( user );
        dataSource.setPassword( password );

        return dataSource.getConnection();
    }
}

1
Por favor, forneça algum código: como você está tentando se conectar. O rastreamento de pilha da exceção também seria útil.
Sergei Sirik

Respostas:


229

Você deve adicionar a opção de cliente ao seu conector mysql allowPublicKeyRetrieval=truepara permitir que o cliente solicite automaticamente a chave pública do servidor. Observe que AllowPublicKeyRetrieval=Truepode permitir que um proxy malicioso execute um ataque MITM para obter a senha de texto simples, portanto, é False por padrão e deve ser explicitamente habilitado.

https://mysql-net.github.io/MySqlConnector/connection-options/

você também pode tentar adicionar useSSL=falseao usá-lo para fins de teste / desenvolvimento

exemplo:

jdbc:mysql://localhost:3306/db?allowPublicKeyRetrieval=true&useSSL=false

Bem, isso funcionou para mim, mas não tenho certeza de quão legítimas essas opções são do ponto de vista da segurança.
Priyank Thakkar de

28
useSSL=false&allowPublicKeyRetrieval=trueé o que eu precisava apenas quando tentei me conectar a partir docker_container1do docker_container2_mysql(where mysql is installed)meu host local. Enquanto da minha máquina host para docker_container2_mysql, useSSL=falseé o suficiente.
prayagupd

1
allowPublicKeyRetrieval = true & amp; useSSL = false, espere que funcione
Martin Klestil

2
Você pode explicar por que esse é o caso?
Capn Sparrow

Adicionar 'allowPublicKeyRetrieval = true' à string de conexão JDBC resolveu o problema do meu sistema de desenvolvimento após uma atualização do Windows 10 ontem. Acho que a Microsoft tampou outro buraco, e a opção deve ser usada "apenas para desenvolvimento" na minha opinião, onde SSL não está ativado.
Alz,

29

Use jdbc urlcomo:

jdbc:mysql://localhost:3306/Database_dbName?allowPublicKeyRetrieval=true&useSSL=false;

PortNo: 3306 pode ser diferente em sua configuração


Uma pequena correção aqui. Os valores aceitáveis ​​da propriedade de conexão 'useSSL' são: 'TRUE', 'FALSE', 'YES' ou 'NO'. O valor 'false;' não é aceitável.
bluelurker,

26

Para usuários DBeaver :

  1. Clique com o botão direito na sua conexão, escolha "Editar Conexão"

  2. Na tela "Configurações de conexão" (tela principal), clique em "Editar configurações do driver"

  3. Clique em "Propriedades da conexão"

  4. Clique com o botão direito na área "propriedades do usuário" e escolha "Adicionar nova propriedade"

  5. Adicione duas propriedades: "useSSL" e "allowPublicKeyRetrieval"

  6. Defina seus valores como "falso" e "verdadeiro" clicando duas vezes na coluna "valor"


10

Como alternativa para as respostas sugeridas você pode tentar e usar mysql_native_password autenticação plug-in em vez de caching_sha2_password autenticação plugin.

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password_here'; 

4

Eu resolvo esse problema usando a configuração abaixo na estrutura de inicialização do Spring

spring.datasource.url=jdbc:mysql://localhost:3306/db-name?useUnicode=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=root

1

No meu caso foi um erro do usuário. Estava usando o rootusuário com uma senha inválida. Não sei por que não recebi um erro de autenticação, mas recebi esta mensagem criptografada.


1

O erro acima no meu caso foi devido ao nome de usuário e senha errados. Resolvendo o problema: 1. Vá para a linha DriverManager.getConnection ("jdbc: mysql: // localhost: 3306 /? UseSSL = false", "username", "password"); Os campos nome de usuário e senha podem estar errados. Digite o nome de usuário e a senha que você usa para iniciar seu cliente mysql. O nome de usuário é geralmente root e a senha é a string que você insere quando uma tela semelhante a esta aparece Tela de inicialização do mysql

Nota: O nome da porta 3306 pode ser diferente no seu caso.


1

Achei esse problema frustrante porque consegui interagir com o banco de dados ontem, mas depois de voltar esta manhã, comecei a receber este erro.

Tentei adicionar a allowPublicKeyRetrieval=truebandeira, mas continuei recebendo o erro.

O que consertou para mim foi fazer Project->Cleanno Eclipse e Cleanno meu servidor Tomcat. Um (ou ambos) consertou.

Não entendo porque, porque construo meu projeto usando Maven, e tenho reiniciado meu servidor a cada mudança de código. Muito irritante ...


1

Atualize o useSSL = true na conexão do aplicativo Spring Boot com mysql;

jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=true&useLegacyDatetimeCode=false&serverTimezone=UTC

1

Eu também estava enfrentando esse problema ao encaixar nosso aplicativo existente. A solução si é adicionar a opção de conexão allowPublicKeyRetrieval do MySQL com um valor true para a string de conexão JDBC. Se isso não funcionar, tente adicionar a opção useSSL a false também.

A string resultante ficaria assim:

jdbc:mysql://<database server ip>:3306/databaseName?allowPublicKeyRetrieval=true&useSSL=false

0

Esta solução funcionou para MacOS Sierra e rodando o MySQL versão 8.0.11. Certifique-se de que o driver que você adicionou em seu caminho de construção - "adicionar jar externo" deve corresponder à versão SQL.

String url = "jdbc:mysql://localhost:3306/syscharacterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";

0

Forneça o URL de conexão como jdbc: mysql: // localhost: 3306 / hb_student_tracker? AllowPublicKeyRetrieval = true & useSSL = false & serverTimezone = UTC


0

Se você estiver recebendo o seguinte erro ao conectar o mysql (local ou contêiner mysql executando o mysql):

java.sql.SQLNonTransientConnectionException: a recuperação da chave pública não é permitida

Solução: adicione a seguinte linha em seu serviço de banco de dados:

command: --default-authentication-plugin=mysql_native_password

0

Em primeiro lugar, certifique-se de que seu servidor de banco de dados esteja instalado e funcionando. Estava recebendo o mesmo erro, depois de tentar todas as respostas listadas aqui descobri que meu servidor de Banco de Dados não estava funcionando.

Você pode verificar o mesmo no MySQL Workbench ou na linha de comando usando

mysql -u USERNAME -p

Isso parece óbvio, mas muitas vezes assumimos que o servidor de banco de dados está ativo e em execução o tempo todo, especialmente quando estamos trabalhando em nossa máquina local, quando reiniciamos / desligamos a máquina, o servidor de banco de dados será desligado automaticamente.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.