최신 JDK 업데이트 후 Java가 MySQL 5.7에 연결할 수 없는 이유와 수정 방법은 무엇입니까?(ssl.SSLHandshakeException:적절한 프로토콜 없음)
2021년 4월 JDK 최신 업데이트(11.0.11+9-0ubuntu2~18.04
)의 지원TLSv1
그리고.TLSv1.1
2021년 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.jar 및 OpenJDK 1.8 버전으로 업그레이드한 후 문제가 해결되었습니다.
다음의 순서를 실행할 수 있습니다.
- java.security 파일을 엽니다.(jre/lib/security 폴더 아래에 있습니다.)
- 줄을 찾아보세요.
jdk.tls.disabledAlgorithms
- 그 완전한 대사를 코멘트해 주세요.
이 후에 실행해 보면 동작합니다.
특정 알고리즘만 사용할 경우 비활성 목록에서 삭제합니다.
이를 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
'programing' 카테고리의 다른 글
워크로드가 IO에 묶여 있을 때 mariadb에서 대량의 데이터를 빠르게 가져오는 방법 (0) | 2023.01.15 |
---|---|
주소 0에 접속할 수 있을까요? (0) | 2023.01.15 |
JavaScript에서 개체 배열과 다른 값을 얻는 방법 (0) | 2023.01.15 |
Hibernate의 MariaDB 방언 클래스 이름은 무엇입니까? (0) | 2023.01.15 |
사용자가 IE를 사용하고 있는지 확인합니다. (0) | 2023.01.15 |