最近使用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"]