连接到 docker 容器外的数据库会出现 TLS 版本错误

Connecting to a database outside the docker container gives TLS version error

我有一个 Spring 启动应用程序,它连接到不在容器内的数据库。在我构建图像和 运行 之后,我得到以下异常:

Caused by: javax.net.ssl.SSLHandshakeException: The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]
    at java.base/sun.security.ssl.Alert.createSSLException(Unknown Source) ~[na:na]
    at java.base/sun.security.ssl.Alert.createSSLException(Unknown Source) ~[na:na]
    at java.base/sun.security.ssl.TransportContext.fatal(Unknown Source) ~[na:na]
    at java.base/sun.security.ssl.TransportContext.fatal(Unknown Source) ~[na:na]
    at java.base/sun.security.ssl.TransportContext.fatal(Unknown Source) ~[na:na]
    at java.base/sun.security.ssl.ServerHello$ServerHelloConsumer.onServerHello(Unknown Source) ~[na:na]
    at java.base/sun.security.ssl.ServerHello$ServerHelloConsumer.consume(Unknown Source) ~[na:na]

在我的 docker 文件中,我厌倦了将 https.protocols 更新为 TLSv1.2,如下所示,但没有按预期工作:

FROM adoptopenjdk/openjdk11:alpine-jre
ARG JAR_FILE=target/portal-0.0.1-SNAPSHOT.jar
WORKDIR /appPortal
COPY ${JAR_FILE} portal.jar
ENTRYPOINT ["java","-Dcom.ibm.jsse2.overrideDefaultTLS = true","-Djdk.tls.client.protocols = 
TLSv1.2","-Dhttps.protocols = TLSv1.2","-jar","portal.jar"]

也许我试图错误地设置 tls 版本,对此有什么建议吗?

您将入口点中的 TLS/SSL 协议更改为选项,但协议应支持 OS(容器级别)。

如果没有带图片的附件,可以用官方的openjdk来测试一下

https://hub.docker.com/_/openjdk

我认为问题是服务器正在使用 TLS 1.0,但默认情况下您的 jvm 不支持。

注意:如果您使用默认禁用 TLS 1.0 的 openjdk 11.0.11(自 2021 年 4 月中旬起),您可能会遇到此类问题。

如果您无法设置数据库服务器以支持更新的 TLS 版本,您 可以通过覆盖默认值来解决此问题:

  • 查找属性文件 /security/java.security
  • 找到包含“jdk.tls.disabledAlgorithms”的行 属性
  • 去掉TLSv1

只是想在这里添加一个直接的答案以供将来参考。我将基本图像用作 docker 文件的“adoptopenjdk/openjdk11:alpine-jre”,似乎 TLS 版本默认为 TLS10。因此,正如@Vinod 和其他一些线程 所建议的那样,我使用了 openjdk:11.0.6-jre-slim,它帮助我省略了额外的入口点选项来设置 TLS 版本。