Kết nối Java-MySql: Không được phép truy xuất khóa công khai


104

Tôi cố gắng kết nối cơ sở dữ liệu MySql với Java bằng trình kết nối 8.0.11. Mọi thứ có vẻ ổn nhưng tôi có ngoại lệ này:

Ngoại lệ trong chuỗi "main" java.sql.SQLNonTransientConnectionException: Không cho phép truy xuất khóa công khai

Theo dõi ngăn xếp:

    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)

Trình quản lý kết nối:

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
Vui lòng cung cấp một số mã: bạn đang cố gắng kết nối như thế nào. Dấu vết ngăn xếp của ngoại lệ cũng sẽ hữu ích.
Sergei Sirik

Câu trả lời:


229

Bạn nên thêm tùy chọn máy khách vào trình kết nối mysql của mình allowPublicKeyRetrieval=trueđể cho phép máy khách tự động yêu cầu khóa công khai từ máy chủ. Lưu ý rằng điều đó AllowPublicKeyRetrieval=Truecó thể cho phép một proxy độc hại thực hiện một cuộc tấn công MITM để lấy mật khẩu văn bản rõ, vì vậy nó là Sai theo mặc định và phải được bật rõ ràng.

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

bạn cũng có thể thử thêm useSSL=falsekhi bạn sử dụng nó cho mục đích thử nghiệm / phát triển

thí dụ:

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

Chà, điều này đã hiệu quả với tôi nhưng tôi không chắc các tùy chọn này hợp pháp như thế nào từ góc độ bảo mật.
Priyank Thakkar

28
useSSL=false&allowPublicKeyRetrieval=truelà những gì tôi cần chỉ khi tôi cố gắng kết nối từ docker_container1để docker_container2_mysql(where mysql is installed)trong máy chủ địa phương của tôi. Trong khi từ máy chủ của tôi đến docker_container2_mysql, useSSL=falselà đủ.
Prayagupd

1
allowPublicKeyRetrieval = true & amp; useSSL = false, bể bạn nó hoạt động
Martin Klestil

2
Bạn có thể giải thích tại sao lại như vậy không?
Capn Sparrow

Thêm 'allowPublicKeyRetrieval = true' vào chuỗi kết nối JDBC của tôi đã giải quyết được sự cố hệ thống phát triển của tôi sau bản cập nhật Windows 10 ngày hôm qua. Đoán rằng Microsoft đã cắm một lỗ hổng khác và tùy chọn sẽ được sử dụng "chỉ để phát triển" theo quan điểm của tôi, nơi SSL không được bật.
Alz

29

Sử dụng jdbc urlnhư:

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

PortNo: 3306 có thể khác nhau trong cấu hình của bạn


Một điều chỉnh nhỏ ở đây. Các giá trị được chấp nhận của thuộc tính kết nối 'useSSL' là: 'TRUE', 'FALSE', 'YES' hoặc 'NO'. Giá trị 'false;' không thể chấp nhận được.
bluelurker

26

Đối với người dùng DBeaver :

  1. Nhấp chuột phải vào kết nối của bạn, chọn "Chỉnh sửa kết nối"

  2. Trên màn hình "Cài đặt kết nối" (màn hình chính) nhấp vào "Chỉnh sửa cài đặt trình điều khiển"

  3. Nhấp vào "Thuộc tính kết nối"

  4. Nhấp chuột phải vào khu vực "thuộc tính người dùng" và chọn "Thêm thuộc tính mới"

  5. Thêm hai thuộc tính: "useSSL" và "allowPublicKeyRetrieval"

  6. Đặt giá trị của chúng thành "false" và "true" bằng cách nhấp đúp vào cột "value"


10

Ngoài các câu trả lời được đề xuất, bạn có thể thử và sử dụng plugin xác thực mysql_native_password thay vì plugin xác thực caching_sha2_password .

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

4

Tôi giải quyết vấn đề này bằng cách sử dụng cấu hình bên dưới trên khung khởi động mùa xuân

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

Trong trường hợp của tôi, đó là lỗi của người dùng. Tôi đang sử dụng rootngười dùng có mật khẩu không hợp lệ. Tôi không chắc tại sao mình không gặp lỗi xác thực mà lại nhận được thông báo khó hiểu này.


1

Lỗi ở trên trong trường hợp của tôi thực sự là do tên người dùng và mật khẩu sai. Giải quyết vấn đề: 1. Vào dòng DriverManager.getConnection ("jdbc: mysql: // localhost: 3306 /? UseSSL = false", "tên người dùng", "mật khẩu"); Tên người dùng và mật khẩu trường có thể sai. Nhập tên người dùng và mật khẩu mà bạn sử dụng để khởi động ứng dụng mysql của mình. Tên người dùng thường là root và mật khẩu là chuỗi mà bạn nhập khi màn hình tương tự như màn hình này xuất hiện Màn hình khởi động của mysql

Lưu ý: Tên cổng 3306 có thể khác trong trường hợp của bạn.


1

Tôi thấy vấn đề này thật khó chịu vì tôi đã có thể tương tác với cơ sở dữ liệu ngày hôm qua, nhưng sau khi quay lại vào sáng nay, tôi bắt đầu gặp lỗi này.

Tôi đã thử thêm allowPublicKeyRetrieval=truecờ nhưng vẫn gặp lỗi.

Điều đã khắc phục sự cố cho tôi đang làm Project->Cleantrong Eclipse và Cleantrên máy chủ Tomcat của tôi. Một (hoặc cả hai) trong số đó đã sửa nó.

Tôi không hiểu tại sao, vì tôi xây dựng dự án của mình bằng Maven và đã khởi động lại máy chủ của mình sau mỗi lần thay đổi mã. Rất khó chịu ...


1

Cập nhật useSSL = true trong kết nối ứng dụng khởi động mùa xuân với mysql;

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

1

Tôi cũng gặp phải vấn đề như vậy trong khi làm dày thêm ứng dụng hiện có của chúng tôi. Giải pháp si để thêm tùy chọn kết nối allowPublicKeyRetrieval của MySQL với giá trị đúng với chuỗi kết nối JDBC. Nếu điều đó không hiệu quả, hãy thử thêm tùy chọn useSSL vào false .

Chuỗi kết quả sẽ giống như sau:

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

0

Giải pháp này hoạt động cho MacOS Sierra và chạy MySQL phiên bản 8.0.11. Hãy đảm bảo rằng trình điều khiển bạn đã thêm vào đường dẫn xây dựng của mình - "thêm lọ bên ngoài" phải khớp với phiên bản SQL.

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

0

Cung cấp URL kết nối là jdbc: mysql: // localhost: 3306 / hb_student_tracker? AllowPublicKeyRetrieval = true & useSSL = false & serverTimezone = UTC


0

Nếu bạn gặp lỗi sau khi kết nối mysql (vùng chứa local hoặc mysql đang chạy mysql):

java.sql.SQLNonTransientConnectionException: Không cho phép truy xuất khóa công khai

Giải pháp: Thêm dòng sau vào dịch vụ cơ sở dữ liệu của bạn:

command: --default-authentication-plugin=mysql_native_password

0

Trước hết, hãy đảm bảo rằng máy chủ Cơ sở dữ liệu của bạn đang hoạt động. Tôi gặp phải lỗi tương tự, sau khi thử tất cả các câu trả lời được liệt kê ở đây, tôi phát hiện ra rằng máy chủ Cơ sở dữ liệu của tôi không chạy.

Bạn có thể kiểm tra tương tự từ MySQL Workbench hoặc Dòng lệnh bằng cách sử dụng

mysql -u USERNAME -p

Điều này nghe có vẻ hiển nhiên, nhưng nhiều khi chúng ta cho rằng máy chủ Cơ sở dữ liệu luôn hoạt động và luôn hoạt động, đặc biệt là khi chúng ta đang làm việc trên máy cục bộ, khi chúng ta khởi động lại / tắt máy, máy chủ cơ sở dữ liệu sẽ tự động tắt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.