[java] 연결 Java-MySql : 공개 키 검색이 허용되지 않습니다.

커넥터 8.0.11을 사용하여 MySql 데이터베이스를 Java와 연결하려고합니다. 모든 것이 정상인 것 같지만이 예외가 있습니다.

스레드 “main”java.sql.SQLNonTransientConnectionException의 예외 : 공개 키 검색이 허용되지 않습니다.

스택 추적 :

    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)

커넥터 관리자 :

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();
    }
}



답변

mysql-connector allowPublicKeyRetrieval=true에 클라이언트 옵션을 추가 하여 클라이언트가 서버에서 자동으로 공개 키를 요청할 수 있도록해야합니다. 참고 AllowPublicKeyRetrieval=True악의적 인 프록시, 일반 텍스트 암호를 얻을 수있는 MITM 공격을 수행 할 수 있도록 할 수는 그래서 기본적으로 False입니다 명시 적으로 활성화해야합니다.

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

useSSL=false테스트 / 개발 목적으로 사용할 때 추가해 볼 수도 있습니다.

예:

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


답변

다음 jdbc url으로 사용 :

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

PortNo: 3306 구성이 다를 수 있습니다.


답변

대한 DBeaver의 사용자 :

  1. 연결을 마우스 오른쪽 단추로 클릭하고 “연결 편집”을 선택하십시오.

  2. “연결 설정”화면 (메인 화면)에서 “드라이버 설정 편집”을 클릭합니다.

  3. “연결 속성”을 클릭합니다.

  4. “사용자 속성”영역을 마우스 오른쪽 단추로 클릭하고 “새 속성 추가”를 선택합니다.

  5. “useSSL”및 “allowPublicKeyRetrieval”의 두 가지 속성을 추가합니다.

  6. “값”열을 두 번 클릭하여 해당 값을 “거짓”및 “참”으로 설정합니다.


답변

또한 제안 된 답변에 당신이 시도하고 사용할 수 mysql_native_password 인증 플러그인 대신 caching_sha2_password 인증 플러그인.

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


답변

스프링 부트 프레임 워크에서 아래 구성을 사용하여이 문제를 해결합니다.

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


답변

제 경우에는 사용자 오류였습니다. root잘못된 비밀번호로 사용자를 사용하고있었습니다 . 왜 인증 오류가 발생하지 않고 대신이 비밀 메시지를 받았는지 모르겠습니다.


답변

제 경우 위의 오류는 실제로 잘못된 사용자 이름과 비밀번호로 인한 것입니다. 문제 해결 : 1. DriverManager.getConnection ( “jdbc : mysql : // localhost : 3306 /? useSSL = false”, “username”, “password”); 줄로 이동합니다. 사용자 이름 및 비밀번호 필드가 잘못되었을 수 있습니다. mysql 클라이언트를 시작하는 데 사용하는 사용자 이름과 비밀번호를 입력합니다. 사용자 이름은 일반적으로 루트이고 암호는 이와 유사한 화면이 나타날 때 입력하는 문자열 입니다. mysql의 시작 화면

참고 : 포트 이름 3306은 경우에 따라 다를 수 있습니다.