본문 바로가기

소프트웨어

Task - MySQL SSL Error (com.mysql.cj.jdbc.exceptions.CommunicationsException)

반응형

바보(?)가 되지 않기 위해서 시작한 Task App 개발 프로젝트를 시작하고 이제 아주아주 간단한 기능들은 구현이 되어서 API 배포를 해봤어요. API 배포 과정에서 발생했던 별거 아닌 이슈에 대해 트러블 슈팅한 내용을 기록하는 포스팅입니다.

 

우선 AWS EC2 인스턴스를 Ubuntu 18.04 로 생성했습니다. Database 사용을 위해서 MariaDB로 RDS 인스턴스도 생성했죠. 그리고 git clone 후 H2 Database 사용한 경우는 정상적으로 작동되었습니다.

그런데 RDS와 통신하여 동작하도록 세팅하면 Exception이 발생했습니다,,,

 

 

$ sudo ./gradlew build -x test
Starting a Gradle Daemon, 1 busy Daemon could not be reused, use --status for details

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.8.3/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 22s
4 actionable tasks: 3 executed, 1 up-to-date

 

빌드는 잘 되었는데 말이죠.....

 

$ java -jar build/libs/todo-0.0.1-SNAPSHOT.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.4.5)

< LOG SKIP >

com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
        at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) ~[mysql-connector-java-8.0.23.jar!/:8.0.23]
< LOG SKIP >
Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_292]
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_292]
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_292]
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_292]
        at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) ~[mysql-connector-java-8.0.23.jar!/:8.0.23]
        at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) ~[mysql-connector-java-8.0.23.jar!/:8.0.23]
        at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151) ~[mysql-connector-java-8.0.23.jar!/:8.0.23]
        at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167) ~[mysql-connector-java-8.0.23.jar!/:8.0.23]
        at com.mysql.cj.protocol.a.NativeProtocol.negotiateSSLConnection(NativeProtocol.java:342) ~[mysql-connector-java-8.0.23.jar!/:8.0.23]
        at com.mysql.cj.protocol.a.NativeAuthenticationProvider.connect(NativeAuthenticationProvider.java:167) ~[mysql-connector-java-8.0.23.jar!/:8.0.23]
        at com.mysql.cj.protocol.a.NativeProtocol.connect(NativeProtocol.java:1350) ~[mysql-connector-java-8.0.23.jar!/:8.0.23]
        at com.mysql.cj.NativeSession.connect(NativeSession.java:157) ~[mysql-connector-java-8.0.23.jar!/:8.0.23]
        at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:953) ~[mysql-connector-java-8.0.23.jar!/:8.0.23]
        at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:823) ~[mysql-connector-java-8.0.23.jar!/:8.0.23]
        ... 58 common frames omitted
Caused by: javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
        at sun.security.ssl.HandshakeContext.<init>(HandshakeContext.java:171) ~[na:1.8.0_292]
        at sun.security.ssl.ClientHandshakeContext.<init>(ClientHandshakeContext.java:98) ~[na:1.8.0_292]
        at sun.security.ssl.TransportContext.kickstart(TransportContext.java:220) ~[na:1.8.0_292]
        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:428) ~[na:1.8.0_292]
        at com.mysql.cj.protocol.ExportControlled.performTlsHandshake(ExportControlled.java:317) ~[mysql-connector-java-8.0.23.jar!/:8.0.23]
        at com.mysql.cj.protocol.StandardSocketFactory.performTlsHandshake(StandardSocketFactory.java:188) ~[mysql-connector-java-8.0.23.jar!/:8.0.23]
        at com.mysql.cj.protocol.a.NativeSocketConnection.performTlsHandshake(NativeSocketConnection.java:97) ~[mysql-connector-java-8.0.23.jar!/:8.0.23]
        at com.mysql.cj.protocol.a.NativeProtocol.negotiateSSLConnection(NativeProtocol.java:333) ~[mysql-connector-java-8.0.23.jar!/:8.0.23]
        ... 63 common frames omitted

 

서버 실행 후 출력된 로그 중 일부입니다. 무엇인지는 잘 모르겠지만 CommunicationsException, SSLHandshakeException 이 두가지 Exception 이 핵심인듯 합니다.

 

해결방법은 정말 간단합니다! SSL을 쓰지 않으면 되는것이죠.

 

제 경우는 application.yml에 관련 구성들을 설정하고 있었습니다. 여기서 수정해보죠. useSSL=false 를 query string에 넣어 줍니다.

 

spring:
  datasource:
    url: jdbc:mysql://$AWS_RDS_ENDPOINT_URL:$AWS_RDS_ENDPOINT_PORT/$DATABASE_NAME?useSSL=false

 

이제 다시 빌드를 하고 서버를 실행해주면....?

 

$ java -jar build/libs/todo-0.0.1-SNAPSHOT.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.4.5)

< LOG SKIP >
2021-06-03 13:30:37.326  INFO 5564 --- [           main] com.zziri.todo.TodoApplication           : Started TodoApplication in 17.26 seconds (JVM running for 19.078)

 

정상적으로 실행됩니다!!

 

+ Ubuntu 에서 gradle 빌드할 때에는 왠만하면 sudo 로 빌드해줍시다..!

반응형