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


312

아래 두 클래스를 사용하여 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();
            }
        }
    }
}

2
답장을 보내 주셔서 감사합니다. 괜찮습니다. 문자열 connectionURL 끝에 ssl = true 또는 false를 넣어야한다는 것을 몰랐습니다.
Milos86

감사합니다. 새로운 connectionURL은 어떻습니까?
user3290180

4
오류가 아니라 경고입니다.
Fernando Silveira

답변:


577

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

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

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


41
jdbc 연결 문자열에서 세미 콜론으로
끝나서는 안됩니다

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 내가 사용 & A; 대신 &
Saqib Ahmed

2
@Roger 네트워크가 안전한 경우 SSL을 비활성화하는 경우가 있습니다. 예를 들어 동일한 물리적 하드웨어의 클라이언트가 액세스하는 컨테이너에서만 SQL 서버를 실행하고 있습니다.
Rodney

131

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

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

이것이 IntelliJ / DataGrip을 통해 SSL을 통해 MySQL 데이터베이스에 연결하는 데 필요한 것입니다
Swaraj

23

다음 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>

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

멋지게 들리지만 어떻게 grails-app의 application.yml에 넣을 수 있습니까?
Fusca Software

12

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

예:

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

11

최근에 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


이것이 정답 일뿐만 아니라 가장 상세하고 안전합니다. SSL에 대한 경고가 표시되면 절대로 건너 뛰지 않아야합니다 (샌드 박스 및 로컬 설치 제외). Azure MySQL에 연결하는 Kubernetes Keycloack 9.0.2 클러스터에 적합한 솔루션을 알려주었습니다. 고마워요!
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>

그러나 왜 and 연산자를 사용하지 않습니까? 나는 같은 것을했다 jdbc:mysql://localhost/metastore?useSSL=false&createDatabaseIfNotExist=true. 없이는 잘 작동합니다.
Kulasangar 2016 년

나를 위해 게시 된 값이 매끄럽게 작동 했으므로 2017 년 12 월 말에 hive-2.1.1 hive-site.xml 작업에 이것을 답변으로 표시합니다.
ArifMustafa

7

구성 XML에서 최대 절전 모드 로이 속성을 사용합니다.

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

-serverTimezone = UTC 없이- 작동하지 않습니다


4

해결 방법 MySQL 연결 문자열 끝에 useSSL = false를 추가하십시오.

전의.

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


0

현재 개발 모드에 있기 때문에 Tomcat이 아니라 mysql 서버 구성에서 useSSL을 No로 설정했습니다. 워크 벤치에서 액세스 설정 관리 서버 연결 관리-> 내 연결을 선택했습니다. 내부 연결 탭이 SSL 탭으로 이동하여 설정을 비활성화했습니다. 나를 위해 일했다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.