[java] MySQL 데이터베이스에 연결할 때 SSL 연결에 대한 경고

아래 두 클래스를 사용하여 MySQL 데이터베이스에 연결을 시도했습니다. 그러나 항상이 오류가 발생합니다.

CET 2015 WARN : 서버의 신원 확인없이 SSL 연결을 설정하지 않는 것이 좋습니다. MySQL 5.5.45+, 5.6.26+ 및 5.7.6+ 요구 사항에 따르면 명시 적 옵션이 설정되지 않은 경우 기본적으로 SSL 연결을 설정해야합니다. SSL을 사용하지 않는 기존 애플리케이션을 준수하기 위해 verifyServerCertificate 특성이 ‘false’로 설정됩니다. useSSL = false를 설정하여 SSL을 명시 적으로 비활성화하거나 useSSL = true를 설정하고 서버 인증서 확인을위한 신뢰 저장소를 제공해야합니다.

다음은 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();
            }
        }
    }
}



답변

연결 URL은 다음과 같아야합니다.

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

이렇게하면 SSL이 비활성화되고 SSL 오류도 억제됩니다.


답변

SSL을 사용하지만 서버 확인을 끄는 방법 (예 : 컴퓨터의 개발 모드에있는 경우) :

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


답변

다음 url과 같이 언급하십시오 .

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

그러나 &부호 를 언급 할 때 XML 구성 에서 IDE는 아래 오류를 표시합니다.

“useSSL”엔티티에 대한 참조는 ‘;’로 끝나야합니다. 구분자.

그리고 당신은 명시 적으로 사용해야하는 &대신 &으로 결정하는 &xml에 이후 xml이 같은 XML 구성의 URL을 제공 할 수있다 :

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


답변

다른 방법은 다음과 같습니다.

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


답변

이 경고도 발견 한 다음이 예제 코드와 같이 연결 문자열에 SSL = false 접미사를 사용하여 수정했습니다.

예:

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


답변

최근에 MySQL 서버에 대한 연결을 시작하기위한 기본값이 변경되었으며 (스택 오버플로에 대한 가장 인기있는 질문과 답변을 빠르게 살펴보면) 새로운 값으로 인해 많은 혼란이 발생합니다. 더 나쁜 것은 표준 조언이 SSL을 완전히 비활성화하는 것으로 보이며, 이는 약간의 재앙입니다.

이제 연결이 네트워크에 실제로 노출되지 않거나 (로컬 호스트 만 해당) 실제 데이터가없는 비 프로덕션 환경에서 작업하는 경우 옵션을 포함하여 SSL을 비활성화해도 아무런 해가 없습니다 useSSL=false.

다른 모든 사람의 경우 SSL을 통해 인증서 및 호스트 확인 작업을 수행하려면 다음 옵션 세트가 필요합니다.

  • useSSL = true
  • sslMode = VERIFY_IDENTITY
  • trustCertificateKeyStoreUrl = 파일 : 경로 _to_keystore
  • trustCertificateKeyStorePassword = 암호

추가 옵션으로 이미 옵션을 사용하면서 약한 SSL 프로토콜을 비활성화하는 것은 간단합니다.

  • enabledTLSProtocols = TLSv1.2

실제 예제로 다음과 같은 광범위한 단계를 따라야합니다.

먼저, MySQL 서버 호스트에 대해 유효한 인증서가 생성되어 있고 CA 인증서가 클라이언트 호스트에 설치되어 있는지 확인하십시오 (자체 서명을 사용하는 경우 수동으로 수행해야 함). 인기있는 공공 CA는 이미있을 것입니다).

다음으로 java 키 저장소에 모든 CA 인증서가 포함되어 있는지 확인하십시오. 데비안 / 우분투에서는 다음을 실행하면됩니다 :

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

그런 다음 마지막으로 데비안 / 우분투에서 필요한 옵션을 모두 포함하도록 연결 문자열을 업데이트하십시오 (필요에 따라 조정).

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


답변

다음과 같이 mysql 경로를 사용해야합니다.

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