连接到 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来测试一下
我认为问题是服务器正在使用 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 版本。
我有一个 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来测试一下
我认为问题是服务器正在使用 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 和其他一些线程