คำเตือนเกี่ยวกับการเชื่อมต่อ SSL เมื่อเชื่อมต่อกับฐานข้อมูล MySQL


312

ด้วยสองคลาสด้านล่างฉันได้ลองเชื่อมต่อกับฐานข้อมูล MySQL อย่างไรก็ตามฉันได้รับข้อผิดพลาดนี้เสมอ:

พุธ Dec 09 22:46:52 CET 2015 WARN: ไม่แนะนำการสร้างการเชื่อมต่อ SSL โดยไม่ต้องมีการตรวจสอบตัวตนของเซิร์ฟเวอร์ ตาม MySQL 5.5.45+, 5.6.26+ และ 5.7.6+ ข้อกำหนดการเชื่อมต่อ SSL จะต้องสร้างขึ้นตามค่าเริ่มต้นหากไม่ได้ตั้งค่าตัวเลือกที่ชัดเจน เพื่อให้สอดคล้องกับแอปพลิเคชันที่ไม่ได้ใช้ SSL คุณสมบัติ VerifyServerCertificate จะถูกตั้งค่าเป็น 'false' คุณต้องปิดการใช้งาน SSL อย่างชัดเจนโดยการตั้งค่า useSSL = false หรือตั้ง useSSL = true และจัดให้มี truststore สำหรับการตรวจสอบใบรับรองเซิร์ฟเวอร์

นี่คือคลาสทดสอบด้วยmainวิธีการ:

public class TestDatabase {

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

นี่คือDatabaseคลาส:

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
ขอบคุณสำหรับการตอบกลับมันโอเคฉันเพิ่งไม่รู้ว่าฉันต้องใส่ ssl = จริงหรือเท็จที่จุดสิ้นสุดของการเชื่อมต่อสตริงของฉัน URL
Milos86

ขอบคุณดังนั้นมันคือการเชื่อมต่อใหม่ UUR?
user3290180

4
ไม่ใช่ข้อผิดพลาดมันเป็นคำเตือน
Fernando Silveira

คำตอบ:


577

URL การเชื่อมต่อของคุณควรมีลักษณะดังนี้

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

วิธีนี้จะปิดใช้งาน SSL และยังระงับข้อผิดพลาด SSL


41
ในสตริงการเชื่อมต่อ jdbc ไม่ควรลงท้ายด้วยเครื่องหมายจุดคู่กึ่ง
Amith

8
ในไฟล์บริบท tomcat jdbc: mysql: // localhost: 3306 / databaseName? autoReconnect = true; useSSL = false;
Amith

27
ความสับสนของเซมิโคลอนอาจเกิดจากความจริงที่ว่าในการกำหนดค่า XML คุณต้องมีมันเป็น? autoReconnect = true & amp; useSSL = false มิฉะนั้นโปรแกรมแยกวิเคราะห์คิดว่าคุณมีเอนทิตี้แปลก ๆ บางอย่างที่คุณต้องลงท้ายด้วย ';'
Bostone

25
ฉันมีปัญหาเดียวกันในโหมดไฮเบอร์เนต แต่ได้รับการแก้ไขโดย URL เช่นนี้: jdbc:mysql://localhost:3306/Peoples?autoReconnect=true&useSSL=false ฉันใช้& amp; แทน&
Saqib Ahmed

2
@Roger ที่มีกรณีสำหรับการปิดใช้งาน SSL หากเครือข่ายมีความปลอดภัย ตัวอย่างเช่นฉันมีเซิร์ฟเวอร์ SQL ที่ทำงานในภาชนะที่เข้าถึงได้โดยลูกค้าบนฮาร์ดแวร์ทางกายภาพเดียวกัน
ร็อดนีย์

131

วิธีการเกี่ยวกับการใช้ SSL แต่ปิดการตรวจสอบเซิร์ฟเวอร์ (เช่นเมื่ออยู่ในโหมดการพัฒนาบนคอมพิวเตอร์ของคุณเอง):

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

นี่คือสิ่งที่ฉันต้องทำเพื่อเชื่อมต่อกับฐานข้อมูล MySQL ผ่าน SSL ผ่าน IntelliJ / DataGrip
Swaraj

23

พูดถึงurlเช่น:

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

แต่ในการกำหนดค่า xml เมื่อคุณพูดถึง&สัญญาณ IDE แสดงข้อผิดพลาดด้านล่าง:

การอ้างอิงถึงเอนทิตี "useSSL" จะต้องลงท้ายด้วย ';' คั่น

และจากนั้นคุณจะต้องใช้&แทน&จะถูกกำหนด&โดยxmlหลังจากนั้นxmlคุณจะต้องให้ URL ในการกำหนดค่า XML เช่นนี้:

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

22

วิธีการทางเลือกจะเป็น:

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) {
...
}

ฟังดูดี แต่ฉันจะนำมันเข้าไปในแอปพลิเคชันของฉันได้อย่างไร
ซอฟต์แวร์ Fusca

12

ฉันพบคำเตือนนี้เช่นกันจากนั้นฉันก็แก้ไขมันโดยใช้ SSL = คำต่อท้ายเท็จกับสตริงการเชื่อมต่อเช่นรหัสตัวอย่างนี้

ตัวอย่าง:

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

11

ค่าเริ่มต้นสำหรับการเริ่มต้นการเชื่อมต่อกับเซิร์ฟเวอร์ MySQL มีการเปลี่ยนแปลงในอดีตที่ผ่านมาและ (จากการดูอย่างรวดเร็วผ่านคำถามและคำตอบที่ได้รับความนิยมมากที่สุดในกองล้น) ค่าใหม่จะทำให้เกิดความสับสนมาก สิ่งที่แย่กว่านั้นคือคำแนะนำมาตรฐานดูเหมือนว่าจะปิดการใช้งาน SSL ทั้งหมดซึ่งเป็นความเสียหายเล็กน้อยในการสร้าง

ตอนนี้ถ้าเชื่อมต่อของคุณอย่างแท้จริงไม่ได้สัมผัสกับเครือข่าย (localhost เท่านั้น) หรือคุณจะทำงานในสภาพแวดล้อมที่ไม่ใช่การผลิตที่มีข้อมูลไม่จริงแล้วตรวจสอบว่ามีอันตรายในการปิดการใช้งาน SSL useSSL=falseโดยรวมทั้งตัวเลือกไม่มี

สำหรับทุกคนต้องใช้ชุดตัวเลือกต่อไปนี้เพื่อให้ SSL ทำงานกับใบรับรองและการยืนยันโฮสต์:

  • useSSL = true
  • sslMode = VERIFY_IDENTITY
  • trustCertificateKeyStoreUrl = ไฟล์: path_to_keystore
  • trustCertificateKeyStorePassword = รหัสผ่าน

ในฐานะโบนัสที่เพิ่มเข้ามาเมื่อคุณได้เล่นกับตัวเลือกแล้วมันเป็นเรื่องง่ายที่จะปิดการใช้งานโปรโตคอล SSL ที่อ่อนแอเช่นกัน:

  • enabledTLSProtocols = TLSv1.2

ตัวอย่าง

เพื่อเป็นตัวอย่างในการทำงานคุณจะต้องทำตามขั้นตอนกว้าง ๆ ดังต่อไปนี้:

ขั้นแรกตรวจสอบให้แน่ใจว่าคุณมีใบรับรองที่ถูกต้องที่สร้างขึ้นสำหรับโฮสต์เซิร์ฟเวอร์ MySQL และติดตั้งใบรับรอง CA ไว้บนโฮสต์ของลูกค้า (หากคุณใช้การลงนามด้วยตนเองคุณอาจต้องดำเนินการด้วยตนเอง แต่สำหรับ CA สาธารณะยอดนิยมมันจะอยู่ที่นั่นแล้ว)

ถัดไปตรวจสอบให้แน่ใจว่าที่เก็บคีย์ java มีใบรับรอง CA ทั้งหมด บน Debian / Ubuntu สิ่งนี้สามารถทำได้โดยการเรียกใช้:

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

จากนั้นให้อัปเดตสตริงการเชื่อมต่อเพื่อรวมตัวเลือกทั้งหมดที่จำเป็นซึ่งบน Debian / Ubuntu จะเป็นอะไรที่คล้าย ๆ กัน (ปรับตามต้องการ):

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

การอ้างอิง: https://beansandanicechianti.blogspot.com/2019/11/mysql-ssl-configuration.html


นี่ไม่ใช่คำตอบที่ถูกต้องเท่านั้น แต่ยังมีรายละเอียดและปลอดภัยที่สุด หากคุณได้รับคำเตือนเกี่ยวกับ SSL คุณไม่ควรข้ามมัน (ยกเว้นการติดตั้งแซนด์บ็อกซ์และโลคัล) คุณแนะนำให้ฉันใช้โซลูชันที่เหมาะสมสำหรับ Kubernetes Keycloack 9.0.2 ที่เชื่อมต่อกับ Azure MySQL ขอบคุณมาก!
iakko

10

คุณต้องใช้เส้นทาง mysql ของคุณเช่นนี้:

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

9

ไม่เป็นไรสำหรับฉัน:

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

9

ใช้สิ่งนี้เพื่อแก้ปัญหาในกลุ่มในขณะที่ทำการเชื่อมต่อกับ 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>

แต่ทำไมถึงไม่ใช้กับตัวดำเนินการและตัวดำเนินการ jdbc:mysql://localhost/metastore?useSSL=false&createDatabaseIfNotExist=trueฉันมีบางอย่างเช่น โดยไม่ต้องและมันทำงานได้ดี
Kulasangar

สำหรับฉันค่าโพสต์ทำงานได้อย่างราบรื่นดังนั้นฉันจะตั้งค่าสถานะนี้เป็นคำตอบในสิ้นเดือนธันวาคมปี 2017 และทำงานกับ hive-2.1.1 hive-site.xml
ArifMustafa

7

ฉันใช้คุณสมบัตินี้เพื่อจำศีลใน config xml

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

ไม่มี - serverTimezone = UTC - ไม่ทำงาน


4

วิธีแก้ไขเมื่อต้องการแก้ไขให้ผนวก useSSL = false ที่ส่วนท้ายของสตริงการเชื่อมต่อ MySQL:

อดีต

application.properties

แหล่งข้อมูล 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

เวอร์ชันใหม่ของตัวเชื่อมต่อ mysql สร้างการเชื่อมต่อ SSL เป็นค่าเริ่มต้น ... เพื่อแก้ปัญหา:

ดาวน์โหลด mysql-connector รุ่นเก่าเช่นmysql-connector-java-5.0.8.zip

. . หรือ . . ดาวน์โหลดOpenSSL สำหรับ Windowsและทำตามคำแนะนำวิธีการตั้งค่า


0

เนื่องจากขณะนี้ฉันอยู่ในโหมดการพัฒนาฉันตั้ง useSSL เป็น No ไม่อยู่ใน tomcat แต่อยู่ในการกำหนดค่าเซิร์ฟเวอร์ mysql ไปจัดการการตั้งค่าการเข้าถึงการจัดการเซิร์ฟเวอร์จาก workbench -> เลือกการเชื่อมต่อของฉัน แท็บการเชื่อมต่อภายในไปที่แท็บ SSL และปิดใช้งานการตั้งค่า ทำงานให้ฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.