programing

최신 JDK 업데이트 후 Java가 MySQL 5.7에 연결할 수 없는 이유와 수정 방법은 무엇입니까?(ssl.SSLHandshakeException:적절한 프로토콜 없음)

yoursource 2023. 1. 15. 13:06
반응형

최신 JDK 업데이트 후 Java가 MySQL 5.7에 연결할 수 없는 이유와 수정 방법은 무엇입니까?(ssl.SSLHandshakeException:적절한 프로토콜 없음)

2021년 4월 JDK 최신 업데이트(11.0.11+9-0ubuntu2~18.04)의 지원TLSv1그리고.TLSv1.12021년 3월부터는 이러한 버전이 지원되지 않게 되었기 때문일 것입니다.이것은, 의 차이에 의해서 분명히 알 수 있습니다.java.security파일:

이전:

jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, DH keySize < 1024, \
    EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
    include jdk.disabled.namedCurves

그 후:

jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
    DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
    include jdk.disabled.namedCurves

SSLHandShakeException No Applicate Protocol」(SSLHandShakeException No Applicate Protocol)에서도 설명하고 있습니다.이 스레드에는 JDK 버전이 업데이트된 후 며칠 동안 더 많은 답변이 표시됩니다.

이 JDK 업데이트 후 오류가 발생했습니다.

java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.

와 함께c3p0.

전환 후hikari더 의미 있는 오류가 발생했습니다.

ERROR [2021-04-29 16:21:16,426] com.zaxxer.hikari.pool.HikariPool: HikariPool-1 - Exception during pool initialization.
! javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)

MySQL에서 실행 중입니다.5.7.33-0ubuntu0.18.04.1여기서 설명한 바와 같이 MySQL 5.7은 TLSv1.2를 지원합니다.실행 시에도SHOW VARIABLES LIKE 'tls_version';얻을 수 있다TLSv1,TLSv1.1,TLSv1.2그것은 을 암시한다.TLSv1.2지원되고 있습니다.

그렇다면 질문은 JDK와 MySQL이 왜 이 기능을 사용하는 데 동의하지 않는가 하는 것입니다.TLSv1.2그리고 우리가 할 수 있는 일은 무엇일까? 그들이 서로 소통하도록 하기 위해서TLSv1.2?

주의: 제 생각에는,java.security다른 스레드에 제시된 바와 같이 파일은 이 문제에 대한 장기간의 좋은 해결책입니다.

@skelwa가 이미 코멘트했으므로enabledTLSProtocols=TLSv1.2연결 문자열의 구성 속성을 사용하여 문제를 해결합니다.

Connector/J의 완전한 연결 문자열은 다음과 같습니다.

jdbc:mysql://<host>:<port>/<dbname>?enabledTLSProtocols=TLSv1.2

r2dbc의 경우,tlsVersion=TLSv1.2대신.

커넥터/J v8.0.28의 경우 enabledTLSProtocols로 이름이 변경되었습니다.tlsVersions(주 참조).그러나 원래 이름은 별칭으로 유지됩니다.


남은 질문은 다음과 같습니다.

왜 JDK와 MySQL은 이 기능을 사용하는데 동의하지 않는가?TLSv1.2?

실제로는 양쪽 모두 TLSv1.2를 지원하고 있습니다만, 문제가 발생하고 있는 것은, Connector/J 의 디폴트 동작에 의한 것입니다.호환성을 위해 Connector/J는 기본적으로 TLSv1.2 이상을 활성화하지 않습니다.따라서 명시적으로 활성화해야 합니다.

다음의 주의 사항을 참조해 주세요.

Connector/J 8.0.18 이전 버전의 경우 JDBC API를 사용하여 MySQL Community Server 5.6 및 5.7에 연결하는 경우: YASSL로 컴파일된 MySQL Server와의 호환성 문제로 인해 Connector/J는 기본적으로 TLSv1.2 이상과의 연결을 활성화하지 않습니다.연결을 제한하는 서버에 연결하여 상위 버전의 TLS를 사용할 경우 Connector/J 연결 속성을 사용하도록 설정하여 TLS를 명시적으로 활성화하십시오.TLSProtocols(예를 들어 활성화 설정)TLSProtocols=TLSv1, TLSv1.1, TLSv1.2).


경고: 다음 점에 주의해 주십시오. 솔루션 편집 제안jdk.tls.disabledAlgorithms의 of의 jre/lib/security어플리케이션에 보안 위험을 초래하고, 어플리케이션의 변경은 중대한 영향을 미칠 수 있습니다.이러한 프로토콜이 비활성화된 데는 이유가 있으며 목록에서 모든 것 또는 일부만 제거해서는 안 됩니다.


주의: 문제를 디버깅하기 위해 JDK에서 보다 낮은 수준의 통찰력을 얻으려면 다음 설정을 Java 커맨드에 전달하여 ssl 디버깅로그를 이노블로 할 수 있습니다.

-Djavax.net.debug=ssl,handshake또는 심지어-Djavax.net.debug=all

이 경우 다음과 같이 표시됩니다.

...(HANDSHAKE_FAILURE): Couldn't kickstart handshaking (
"throwable" : {
  javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
    at java.base/sun.security.ssl.HandshakeContext.<init>(HandshakeContext.java:170)
    at java.base/sun.security.ssl.ClientHandshakeContext.<init>(ClientHandshakeContext.java:98)
    ...

방금 useSSL=false를 추가했는데 효과가 있었습니다.

jdbc:mysql://<host>:<port>/<dbname>?useSSL=false

버전 5.1.38의 JDK 8, MySQL 5.7 및 mysql-connector-java lib가 있다.

이는 로컬 환경에서만 신속하게 실행하려는 경우(스테이지/테스트/프로덕트가 아님)에 유용합니다.

저도 같은 문제가 있어서 왔는데 아쉽게도

jdbc:mysql://host:port/dbname?enabledTLSProtocols=LOSV1.2

r2dbc를 사용하고하지 않았습니다. 「」가 되어 있는 알 수 .tlsVersion신음

spring.r2dbc.url=r2dbc:mysql://host:port/dname?tlsVersion=TLSv1.2

이전 버전의 mysql-connector-java-5.1.40-bin.jarOpenJDK 1.8 버전으로 업그레이드한 후 문제가 해결되었습니다.

다음의 순서를 실행할 수 있습니다.

  1. java.security 파일을 엽니다.(jre/lib/security 폴더 아래에 있습니다.)
  2. 줄을 찾아보세요.jdk.tls.disabledAlgorithms
  3. 그 완전한 대사를 코멘트해 주세요.

이 후에 실행해 보면 동작합니다.

특정 알고리즘만 사용할 경우 비활성 목록에서 삭제합니다.

이를 config로 전송하고 java.security 파일에 코멘트를 붙일 수 있습니다.

jdbc:mysql://<host>:<port>/<dbname>?enabledTLSProtocols=TLSv1.2

언급URL : https://stackoverflow.com/questions/67332909/why-can-java-not-connect-to-mysql-5-7-after-the-latest-jdk-update-and-how-should

반응형