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


104

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

1
몇 가지 코드를 제공하십시오 : 어떻게 연결을 시도하고 있습니까? 예외의 스택 추적도 도움이 될 것입니다.
Sergei Sirik

답변:


228

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

글쎄, 이것은 나를 위해 일했지만 이러한 옵션이 보안 관점에서 얼마나 합법적인지 잘 모르겠습니다.
Priyank Thakkar

28
useSSL=false&allowPublicKeyRetrieval=true나는에서 연결하는 시도 할 때만 내가 필요로 무엇 docker_container1docker_container2_mysql(where mysql is installed)내 로컬 호스트에서. 내 호스트 컴퓨터에서 docker_container2_mysql, useSSL=false로 충분합니다.
prayagupd

1
allowPublicKeyRetrieval = TRUE & 앰프; useSSL = 거짓, 탱크를 그것을 작동
마틴 Klestil

2
그 이유를 설명해 주시겠습니까?
Capn 참새

내 JDBC 연결 문자열에 'allowPublicKeyRetrieval = true'를 추가하면 어제 Windows 10 업데이트 후 개발 시스템의 문제가 해결되었습니다. 마이크로 소프트가 또 다른 구멍을 막아 냈고 SSL이 켜져 있지 않은 내 관점에서 "개발 전용"옵션을 사용해야한다고 생각한다.
Alz

28

다음 jdbc url으로 사용 :

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

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


여기에 약간의 수정이 있습니다. 연결 특성 'useSSL'허용 가능한 값은 'TRUE', 'FALSE', 'YES'또는 'NO'입니다. 값 'false;' 허용되지 않습니다.
bluelurker

26

대한 DBeaver의 사용자 :

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

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

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

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

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

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


10

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

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

4

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

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

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


1

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

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


1

어제 데이터베이스와 상호 작용할 수 있었기 때문에이 문제가 실망 스러웠지만 오늘 아침에 돌아와서이 오류가 발생하기 시작했습니다.

allowPublicKeyRetrieval=true플래그를 추가하려고 했지만 계속 오류가 발생했습니다.

나를 위해 수정 한 것은 Project->CleanEclipse와 CleanTomcat 서버 에서 수행하는 것 입니다 . 그중 하나 (또는 ​​둘 다)가 문제를 해결했습니다.

Maven을 사용하여 프로젝트를 빌드하고 각 코드 변경 후 서버를 다시 시작했기 때문에 이유를 이해할 수 없습니다. 매우 자극적 ...


1

mysql과의 스프링 부트 애플리케이션 연결에서 useSSL = true를 업데이트하십시오.

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

1

기존 응용 프로그램을 도킹하는 동안에도 이러한 문제에 직면했습니다. 솔루션 si 는 JDBC 연결 문자열 에 true 값을 사용하여 MySQL의 allowPublicKeyRetrieval 연결 옵션 을 추가 합니다. 작동하지 않으면 useSSL 옵션도 false에 추가해보십시오 .

결과 문자열은 다음과 같습니다.

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

0

이 솔루션은 MacOS Sierra에서 작동했으며 MySQL 버전 8.0.11을 실행했습니다. 빌드 경로에 추가 한 드라이버를 확인하십시오. "외부 jar 추가"가 SQL 버전과 일치해야합니다.

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

0

연결 URL을 jdbc : mysql : // localhost : 3306 / hb_student_tracker? allowPublicKeyRetrieval = true & useSSL = false & serverTimezone = UTC로 지정


0

mysql을 연결하는 동안 다음 오류가 발생하는 경우 (mysql을 실행하는 로컬 또는 mysql 컨테이너) :

java.sql.SQLNonTransientConnectionException : 공개 키 검색이 허용되지 않습니다.

솔루션 : 데이터베이스 서비스에 다음 행을 추가하십시오.

command: --default-authentication-plugin=mysql_native_password

0

먼저 데이터베이스 서버가 실행 중인지 확인하십시오. 여기에 나열된 모든 답변을 시도한 후 동일한 오류가 발생했습니다. 데이터베이스 서버가 실행되고 있지 않다는 것을 알았습니다.

MySQL Workbench 또는 명령 줄에서 동일하게 확인할 수 있습니다.

mysql -u USERNAME -p

이것은 당연한 것처럼 들리지만, 많은 경우 우리는 데이터베이스 서버가 항상 실행 중이라고 가정합니다. 특히 로컬 시스템에서 작업 할 때 시스템을 다시 시작 / 종료하면 데이터베이스 서버가 자동으로 종료됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.