연결 Java - MySQL: 공용 키 검색이 허용되지 않습니다.
커넥터 8.0.11을 사용하여 MySQL 데이터베이스와 Java를 연결하려고 합니다.모든 것이 정상인 것처럼 보이지만 다음과 같은 예외가 있습니다.
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)
Connection Manager 클래스는 다음과 같습니다.
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 의 mysql에 .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
DBeaver 사용자의 경우:
연결을 마우스 오른쪽 버튼으로 클릭하고 "연결 편집"을 선택합니다.
"연결 설정" 화면(기본 화면)에서 "드라이버 설정 편집"을 클릭합니다.
"연결 속성"을 클릭합니다.
"사용자 속성" 영역을 마우스 오른쪽 버튼으로 클릭하고 "새 속성 추가"를 선택합니다.
다음 두 가지 속성을 추가합니다."useSSL" 및 "allow PublicKeyRetrieval"
값 열을 두 번 클릭하여 값을 "false" 및 "true"로 설정합니다.
DBeaver에서 이 작업을 수행할 때 "Connection settings" -> "SSL" 탭으로 이동하여 다음을 수행해야 합니다.
- "서버 인증서 확인" 선택을 취소합니다.
- "공개 키 취득 허용" 체크
이것은 로컬 개발에만 적합합니다.
jdbc url
같이
jdbc:mysql://localhost:3306/Database_dbName?allowPublicKeyRetrieval=true&useSSL=False;
PortNo: 3306
수 .
또는 caching_sha2_password 인증 플러그인 대신 mysql_native_password 인증 플러그인을 사용할 수 있습니다.
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password_here';
루트 계정에서 "public-key-retrieval-is-not-allowed" 문제가 발생했을 때 이 파라미터를 갱신했습니다.
이 문제는 스프링 부트 프레임워크에서 다음 구성을 사용하여 해결합니다.
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
먼저 데이터베이스 서버가 가동되고 있는지 확인하십시오.여기에 나와 있는 모든 답변을 시도해 본 결과 데이터베이스 서버가 실행되고 있지 않다는 것을 알게 되었습니다.
MySQL Workbench 또는 명령줄에서 동일한 내용을 확인할 수 있습니다.
mysql -u USERNAME -p
이것은 당연한 것처럼 들리지만 많은 경우 데이터베이스 서버가 항상 가동되고 있다고 가정합니다.특히 로컬머신에서 작업하고 있을 때 머신을 재부팅하거나 셧다운하면 데이터베이스 서버가 자동으로 셧다운됩니다.
이 문제는 사용자 이름 또는 비밀번호가 잘못되어 발생할 수도 있습니다.으로서 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」allowPublicKeyRetrieval=true&useSSL=false
파트를 했는데도 에러가 나서 패스워드를 확인했는데 틀렸어요.
다른 방법으로는 DBeaver에 있습니다.
데이터베이스 연결을 편집하고 연결 설정에서 SSL 탭으로 이동할 수 있습니다."공개 키 검색 허용" 확인란이 있으면 참으로 표시합니다.그럼 문제가 해결됐군
제 경우 위의 오류는 사용자 이름과 비밀번호가 잘못되었기 때문입니다.문제 해결: 1.DriverManager.getConnection 행("jdbc:mysql://localhost:3306/?useSSL=false", "password", "password")으로 이동합니다.사용자 이름과 비밀번호 필드가 잘못되었을 수 있습니다.mysql 클라이언트를 시작하기 위해 사용할 사용자 이름과 비밀번호를 입력합니다.username은 일반적으로 root이고 password는 이와 유사한 화면이 나타날 때 입력하는 문자열입니다.mysql의 Startup screen
주의: 포트명 3306은 경우에 따라 다를 수 있습니다.
이 솔루션은 MacOS Sierra에서 작동하며 MySQL 버전 8.0.11을 실행합니다.빌드 경로에 추가한 드라이버 - "add external jar"가 SQL 버전과 일치하는지 확인하십시오.
String url = "jdbc:mysql://localhost:3306/syscharacterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";
제 경우 사용자 오류입니다. i i하 i i 。root
이치노왜 인증 오류가 발생하지 않고 이 암호 메시지를 받았는지 모르겠습니다.
어제 데이터베이스와 대화할 수 있어서 답답했는데 오늘 아침에 돌아와서 이 오류가 나타나기 시작했어요.
추가하려고 했습니다.allowPublicKeyRetrieval=true
플래그가 켜졌는데 계속 오류가 났어요.
제가 그걸 고친 건Project->Clean
와 이이 eclipse Clean
를 사용합니다.그들 중 한 명(또는 둘 다)이 그것을 고쳤다.
저는 Maven을 사용하여 프로젝트를 작성하고 있으며, 코드가 변경될 때마다 서버를 재시작하고 있기 때문에 그 이유를 알 수 없습니다.너무 짜증나...
연결 URL을 jdbc:mysql://localhost:3306/hb_student_tracker?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=DBA로 지정합니다.
mysql(mysql을 실행하는 로컬컨테이너 또는 mysql컨테이너 중 하나) 연결 중에 다음 오류가 발생할 경우:
java.sql.SQLOnTransientConnection예외: 공용 키 검색이 허용되지 않습니다.
솔루션:데이터베이스 서비스에 다음 행을 추가합니다.
command: --default-authentication-plugin=mysql_native_password
mysql을 사용하여 스프링 부트 애플리케이션 연결에서 useSSL=true를 업데이트합니다.
jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=true&useLegacyDatetimeCode=false&serverTimezone=UTC
MySQL 8.0에서는 기본 인증 플러그인이 mysql_native_password에서 caching_sha2_password로 변경되었습니다.이 변경의 상세한 것에 대하여는, https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password 를 참조해 주세요.
즉, caching_sha2_password를 사용하려면 연결이 다음 중 하나를 수행해야 합니다.
- 보안 연결 사용(useSSL=true)
- RSA 키 쌍을 사용한 암호 교환을 지원하는 암호화되지 않은 연결을 사용합니다(useSSL=false 및 추가 구성 매개 변수 사용 - https://dev.mysql.com/doc/refman/8.0/en/caching-sha2-pluggable-authentication.html) 참조).
몇 가지 옵션이 있습니다.
- 사용자가 mysql_native_password 플러그인을 사용하도록 ALTER합니다(이러한 플러그인은 지금까지의 방법과 같으며 caching_sha2_password를 지원하지 않는 오래된 클라이언트/접속에서도 작동합니다).
- useSSL=true
- useSSL=false를 사용하여 공용 키 검색을 구성합니다(이는 오류를 회피하는 allowPublicKeyRetrieval=true를 사용하는 것이 아니라 이 추가 보안의 목적을 위반하고 속도가 느립니다. 즉, 공용 키의 클라이언트 측 복사본을 가리키기 위해 server-public-key-path와 같은 것을 사용하는 것을 의미합니다).
기존 어플리케이션을 도킹할 때도 그런 문제가 있었습니다.MySQL의 allowPublicKeyRetrieval 연결 옵션을 JDBC 연결 문자열에 true로 추가하는 솔루션 si.이것이 동작하지 않는 경우는, useSSL 옵션도 false 에 추가해 주세요.
결과 문자열은 다음과 같습니다.
jdbc:mysql://<database server ip>:3306/databaseName?allowPublicKeyRetrieval=true&useSSL=false
설정
Server Time Zone
문제를 해결했습니다.
제 고민은pom.xml
(스프링 부트).my pom.xml에는 서로 다른 데이터베이스에 대한 두 개의 종속 항목이 있습니다.MySQL 종속성만 유지하고 다른 데이터베이스 종속성 항목은 모두 제거하십시오.
언급URL : https://stackoverflow.com/questions/50379839/connection-java-mysql-public-key-retrieval-is-not-allowed
'sourcecode' 카테고리의 다른 글
Java에서 개체 크기 계산 (0) | 2022.08.12 |
---|---|
LD_PRELOAD를 사용하여 여러 파일 지정 (0) | 2022.08.12 |
서브디렉토리에서 Vue.js 웹팩 프로젝트를 처리하는 방법 (0) | 2022.08.12 |
새 텍스트 상자 Vue3을 추가할 번호를 입력합니다. (0) | 2022.08.10 |
C++에서의 디버깅 매크로 (0) | 2022.08.10 |