解决Docker项目报javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)异常的问题
最近使用Docker部署Springboot项目遇到连接数据库报javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate) 异常的问题,网上找的原因是由于java通过安全更新已经在8或者8+的小版本中禁用了不安全的TLSv1&TLSv1.1,而我们的项目由于使用很老版本的Mysql数据库,所以导致报错。
网上提供的解决方案是通过修改jre下java.security文件中的jdk.tls.disabledAlgorithms配置,删除掉TLSv1&TLSv1.1来解决,但项目使用Docker容器来部署不可能每次修改该文件,下面提供结局方案。
方案一:使用linux发行版中的openjdk,目前Linux发行版中的配置不知为什么还没有去掉该配置,我们可以通过白的Linux镜像来安装openjdk。
FROM alpine:3.12 # 替换阿里源 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories RUN apk update # env ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' LC_ALL='en_US.UTF-8' ENV JAVA_VERSION 11 ENV JAVA_TOOL_OPTIONS="-XX:+IgnoreUnrecognizedVMOptions -XX:+UseContainerSupport -XX:+IdleTuningCompactOnIdle -XX:+IdleTuningGcOnIdle" ENV JAVA_HOME="/usr/lib/jvm/java-11-openjdk" # 一些openjdk官方docker安装了的包 RUN apk add bzip2 unzip p11-kit # openjdk RUN apk add openjdk11 # 清理apk缓存 RUN rm -rf /var/cache/apk/* # ADD ADD target/demo.jar /app.jar EXPOSE 8080 ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-Xms256m", "-Xmx512m", "-jar", "/app.jar"]
方案二:构建时替换java.security配置,这种方式试用性更广,基于openjdk镜像的如tomcat等镜像也能用。
FROM openjdk:11-jdk # ADD ADD target/demo.jar /app.jar # 解决不支持TLSv1 & TLSv1.1 问题 # 根据基础镜像不同,配置文件位置也不同 RUN sed -i 's/jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1/jdk.tls.disabledAlgorithms=SSLv3/g' /usr/local/openjdk-11/conf/security/java.security EXPOSE 8080 ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-Xms256m", "-Xmx512m", "-jar", "/app.jar"]