Cảnh báo về kết nối SSL khi kết nối với cơ sở dữ liệu MySQL


312

Với hai lớp bên dưới, tôi đã thử kết nối với cơ sở dữ liệu MySQL. Tuy nhiên, tôi luôn gặp lỗi này:

Thứ tư, 09/12/2016 CET 2015 WARN: Không nên thiết lập kết nối SSL mà không cần xác minh danh tính của máy chủ. Theo yêu cầu của MySQL 5.5.45+, 5.6.26+ và 5.7.6+ Kết nối SSL phải được thiết lập theo mặc định nếu tùy chọn rõ ràng không được đặt. Để tuân thủ các ứng dụng hiện có không sử dụng SSL, thuộc tính verifyServerCertert được đặt thành 'false'. Bạn cần vô hiệu hóa SSL một cách rõ ràng bằng cách đặt useSSL = false hoặc đặt useSSL = true và cung cấp cửa hàng tin cậy để xác minh chứng chỉ máy chủ.

Đây là lớp kiểm tra với mainphương thức:

public class TestDatabase {

    public static void main(String[] args) {
        Database db = new Database();
        try {
            db.connect();
        } catch (Exception e) {
            e.printStackTrace();
        }
        db.close();
    }
}

Đây là Databaselớp học:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Database {

    private Connection con;

    public void connect() throws Exception{

        if(con != null) return;

        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            throw new Exception("No database");
        }

        String connectionURL = "jdbc:mysql://localhost:3306/Peoples";

        con = DriverManager.getConnection(connectionURL, "root", "milos23");        
    }

    public void close(){
        if(con != null){
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

2
Cảm ơn đã trả lời, không sao, tôi chỉ không biết rằng tôi cần đặt ssl = true hoặc false vào cuối kết nối StringURL của tôi.
Milos86

cảm ơn, vậy kết nối mới như thế nào?
user3290180

4
Đó không phải là một lỗi, đó là một cảnh báo.
Fernando Silveira

Câu trả lời:


577

URL kết nối của bạn sẽ giống như bên dưới,

jdbc:mysql://localhost:3306/Peoples?autoReconnect=true&useSSL=false

Điều này sẽ vô hiệu hóa SSL và cũng ngăn chặn các lỗi SSL.


41
trong chuỗi kết nối jdbc KHÔNG NÊN kết thúc bằng dấu chấm phẩy
Amith

8
trong tệp ngữ cảnh tomcat jdbc: mysql: // localhost: 3306 / databaseName? autoReconnect = true; useSSL = false;
Amith

27
Sự nhầm lẫn với dấu chấm phẩy có thể là do trong cấu hình XML, bạn cần phải có nó là? AutoReconnect = true & amp; useSSL = false. Mặt khác, trình phân tích cú pháp nghĩ rằng bạn có một thực thể kỳ lạ mà bạn phải kết thúc bằng ';'
Bostone

25
Tôi gặp vấn đề tương tự ở chế độ ngủ đông nhưng được giải quyết bằng URL như thế này: jdbc:mysql://localhost:3306/Peoples?autoReconnect=true&useSSL=false Tôi đã sử dụng & amp; thay vì &
Saqib Ahmed

2
@Rogerthat có những trường hợp vô hiệu hóa SSL nếu mạng được bảo mật. Ví dụ: tôi có các máy chủ SQL chạy trong các thùng chứa chỉ được truy cập bởi các máy khách trên cùng một phần cứng vật lý.
Rodney

131

Cách sử dụng SSL nhưng tắt xác minh máy chủ (chẳng hạn như khi ở chế độ phát triển trên máy tính của bạn):

jdbc:mysql://localhost:3306/Peoples?verifyServerCertificate=false&useSSL=true

Đây là những gì tôi cần làm để kết nối với cơ sở dữ liệu MySQL qua SSL thông qua IntelliJ / DataGrip
Swaraj

23

Đề cập urlnhư thế:

jdbc:mysql://hostname:3306/hibernatedb?autoReconnect=true&useSSL=false

Nhưng trong cấu hình xml khi bạn đề cập đến &dấu hiệu, IDE hiển thị lỗi bên dưới:

Tham chiếu đến thực thể "useSSL" phải kết thúc bằng dấu ';' phân định

Và sau đó bạn phải sử dụng một cách rõ ràng &thay vì &để được xác định như &bởi xmlsau đó trong xmlbạn đã cung cấp cho các url trong cấu hình xml như thế này:

<property name="connection.url">jdbc:mysql://hostname:3306/hibernatedb?autoReconnect=true&amp;useSSL=false</property>

22

Một phương pháp thay thế sẽ là:

Properties properties = new Properties();
properties.setProperty("user", "root");
properties.setProperty("password", "milos23);
properties.setProperty("useSSL", "false");

try (Connection conn = DriverManager.getConnection(connectionUrl, properties)) {
...
} catch (SQLException e) {
...
}

Nghe có vẻ hay, nhưng làm thế nào tôi có được điều này trong application.yml của grails-app của tôi?
Phần mềm Fusca

12

Tôi cũng thấy cảnh báo này sau đó tôi đã sửa nó bằng cách sử dụng SSL = hậu tố sai cho chuỗi kết nối như mã ví dụ này.

Thí dụ:

connectionString = "jdbc:mysql://{server-name}:3306/%s?useUnicode=yes&characterEncoding=UTF-8&useSSL=false"

11

Mặc định cho việc bắt đầu kết nối với máy chủ MySQL đã được thay đổi trong quá khứ gần đây và (từ một cái nhìn nhanh qua các câu hỏi và câu trả lời phổ biến nhất về tràn ngăn xếp), các giá trị mới đang gây ra nhiều nhầm lẫn. Điều tồi tệ hơn là lời khuyên tiêu chuẩn dường như là vô hiệu hóa SSL hoàn toàn, đây là một thảm họa trong quá trình thực hiện.

Bây giờ, nếu kết nối của bạn thực sự không được tiếp xúc với mạng (chỉ dành cho localhost) hoặc bạn đang làm việc trong môi trường phi sản xuất không có dữ liệu thực, thì chắc chắn: không có hại trong việc vô hiệu hóa SSL bằng cách bao gồm tùy chọn useSSL=false.

Đối với những người khác, cần có bộ tùy chọn sau để SSL hoạt động với chứng chỉ máy chủ và xác minh máy chủ:

  • sử dụngSSL = đúng
  • sslMode = VERIFY_IDENTITY
  • trustCertertKeyStoreUrl = file: path_to_keystore
  • trustCertertKeyStorePassword = mật khẩu

Là một phần thưởng bổ sung, khi bạn đang chơi với các tùy chọn, thật đơn giản để vô hiệu hóa các giao thức SSL yếu:

  • enableTLSProt Protocol = TLSv1.2

Thí dụ

Vì vậy, như một ví dụ hoạt động, bạn sẽ cần phải làm theo các bước rộng sau:

Trước tiên, hãy đảm bảo bạn có chứng chỉ hợp lệ được tạo cho máy chủ máy chủ MySQL và chứng chỉ CA được cài đặt trên máy chủ máy khách (nếu bạn đang sử dụng tự ký, thì có thể bạn sẽ cần phải làm điều này bằng tay, nhưng đối với CA công cộng phổ biến nó sẽ có ở đó).

Tiếp theo, hãy chắc chắn rằng kho khóa java chứa tất cả các chứng chỉ CA. Trên Debian / Ubuntu, điều này đạt được bằng cách chạy:

update-ca-certificates -f
chmod 644 /etc/ssl/certs/java/cacerts

Cuối cùng, hãy cập nhật chuỗi kết nối để bao gồm tất cả các tùy chọn bắt buộc, trên Debian / Ubuntu sẽ giống như một chút (thích ứng theo yêu cầu):

jdbc:mysql://{mysql_server}/confluence?useSSL=true&sslMode=VERIFY_IDENTITY&trustCertificateKeyStoreUrl=file%3A%2Fetc%2Fssl%2Fcerts%2Fjava%2Fcacerts&trustCertificateKeyStorePassword=changeit&enabledTLSProtocols=TLSv1.2&useUnicode=true&characterEncoding=utf8

Tham khảo: https://beansandanicechianti.blogspot.com/2019/11/mysql-ssl-configuration.html


Đây không chỉ là câu trả lời đúng mà còn là chi tiết và an toàn nhất. Nếu bạn nhận được cảnh báo về SSL, bạn không bao giờ nên bỏ qua nó (ngoại trừ hộp cát và cài đặt cục bộ). Bạn đã chỉ cho tôi giải pháp phù hợp cho cụm Kubernetes Keycloack 9.0.2 kết nối với Azure MySQL. Cảm ơn rất nhiều!
iakko

10

bạn cần sử dụng đường dẫn mysql của bạn như thế này:

<property name="url" value="jdbc:mysql://localhost:3306/world?useSSL=true"/>

9

Điều này là tốt cho tôi:

this.conn = (Connection)DriverManager
    .getConnection(url + dbName + "?useSSL=false", userName, password);

9

Sử dụng điều này để giải quyết vấn đề trong hive trong khi tạo kết nối với MySQL

<property>
   <name>javax.jdo.option.ConnectionURL</name>
   <value>jdbc:mysql://localhost/metastore?createDatabaseIfNotExist=true&amp;autoReconnect=true&amp;useSSL=false</value>
   <description>metadata is stored in a MySQL server</description>
</property>

Nhưng tại sao nó không mang theo người vận hành ? Tôi đã có một cái gì đó như jdbc:mysql://localhost/metastore?useSSL=false&createDatabaseIfNotExist=true. Không có và nó hoạt động tốt.
Kicesangar

đối với tôi, giá trị được đăng hoạt động trơn tru, vì vậy tôi sẽ đánh dấu đây là câu trả lời vào cuối tháng 12 năm 2017 và làm việc với hive-2.1.1 hive-site.xml.
ArifMustafa

7

Tôi sử dụng thuộc tính này để ngủ đông trong config xml

<property name="hibernate.connection.url">
jdbc:mysql://localhost:3306/bookshop?serverTimezone=UTC&amp;useSSL=false
</property>

không có - serverTimezone = UTC - nó không hoạt động


4

Giải pháp Để khắc phục, hãy thêm useSSL = false vào cuối chuỗi kết nối MySQL:

Ví dụ.

ứng dụng

nguồn dữ liệu mysql

spring.datasource.url=jdbc:mysql://localhost/dbname?useSSL=false
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

2

các phiên bản mới của trình kết nối mysql thiết lập kết nối SSL theo mặc định ... để giải quyết nó:

Tải xuống phiên bản cũ hơn của trình kết nối mysql như mysql-connector-java-5.0.8.zip

. . hoặc là . . Tải xuống OpenSSL cho Windows và làm theo hướng dẫn cách đặt


0

Vì hiện tại tôi đang ở chế độ phát triển, tôi đặt useSSL thành Không không trong tomcat mà trong cấu hình máy chủ mysql. Đã đi để quản lý cài đặt truy cập \ Quản lý kết nối máy chủ từ bàn làm việc -> Đã chọn kết nối của tôi. Tab kết nối bên trong chuyển đến tab SSL và vô hiệu hóa cài đặt. Đã làm cho tôi.

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.