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();
}
}
Respostas:
Você deve adicionar a opção de cliente ao seu conector mysql
allowPublicKeyRetrieval=true
para permitir que o cliente solicite automaticamente a chave pública do servidor. Observe queAllowPublicKeyRetrieval=True
pode 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=false
ao usá-lo para fins de teste / desenvolvimentoexemplo:
fonte
useSSL=false&allowPublicKeyRetrieval=true
é o que eu precisava apenas quando tentei me conectar a partirdocker_container1
dodocker_container2_mysql(where mysql is installed)
meu host local. Enquanto da minha máquina host paradocker_container2_mysql
,useSSL=false
é o suficiente.Use
jdbc url
como:PortNo: 3306
pode ser diferente em sua configuraçãofonte
Para usuários DBeaver :
Clique com o botão direito na sua conexão, escolha "Editar Conexão"
Na tela "Configurações de conexão" (tela principal), clique em "Editar configurações do driver"
Clique em "Propriedades da conexão"
Clique com o botão direito na área "propriedades do usuário" e escolha "Adicionar nova propriedade"
Adicione duas propriedades: "useSSL" e "allowPublicKeyRetrieval"
Defina seus valores como "falso" e "verdadeiro" clicando duas vezes na coluna "valor"
fonte
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.
fonte
Eu resolvo esse problema usando a configuração abaixo na estrutura de inicialização do Spring
fonte
No meu caso foi um erro do usuário. Estava usando o
root
usuário com uma senha inválida. Não sei por que não recebi um erro de autenticação, mas recebi esta mensagem criptografada.fonte
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.
fonte
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=true
bandeira, mas continuei recebendo o erro.O que consertou para mim foi fazer
Project->Clean
no Eclipse eClean
no 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 ...
fonte
Atualize o useSSL = true na conexão do aplicativo Spring Boot com mysql;
fonte
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:
fonte
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.
fonte
Forneça o URL de conexão como jdbc: mysql: // localhost: 3306 / hb_student_tracker? AllowPublicKeyRetrieval = true & useSSL = false & serverTimezone = UTC
fonte
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:
fonte
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
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.
fonte