运行 Java 应用程序在 Docker 工具箱中出现 SunCertPathBuilderException
SunCertPathBuilderException when running a Java application in Docker Toolbox
我有一个 Spring 引导 Java 应用程序,我想将其 运行 放入 Docker 容器中。该应用程序通过 HTTPS 与内部网络上的另一个服务通信,但是当我 运行 Docker 容器时,我得到以下异常(由 HTTPS 连接引起):
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
我的开发机器上也有同样的异常,我使用 this tutorial.
修复了这个异常
我试过的
- 很多建议指出
DOCKER_CERT_PATH
变量需要正确设置,但是当我 运行 docker-machine env default
时,我看到它指向 C:\Users\username\.docker\machines\machine\default
.
- 我尝试获取证书并使用 this advice
将其放入此文件夹
- 我尝试添加
-Dtrust_all_cert=true
Java 选项来禁用证书检查
- 我尝试使用
从 org.spotify.dockerfile-maven-plugin
切换到 org.spotify.docker-maven-plugin
- 我关注了 this tutorial 并设法将证书添加到
/etc/ssl/certs/java/cacerts
以及 Docker 图像中的 /usr/lib/jvm/java-1.8-openjdk/jre/lib/security/cacerts
。
不幸的是,None 这些解决方案有效。
我的问题
我应该怎么做才能摆脱这个异常?
我的Docker文件(应用之前的解决方案后)
FROM openjdk:8-jdk-alpine
# to enable file writes
VOLUME /tmp
ADD target/trip-force-0.1.0.jar app.jar
# java cacerts
COPY ./res/timur.domain.local.cer /timur.domain.local.cer
ENV CACERTS /etc/ssl/certs/java/cacerts
RUN keytool -noprompt -import -alias timur -keystore ${CACERTS} -file /timur.domain.local.cer
ENV JAVA_OPTS="-Dtrust_all_cert=true"
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
最终成功的是解决方案,我可能一开始就应该尝试,因为它解决了我开发机器上的问题。
使用 this tutorial (and downloading the InstallCert.java file from here) 我刚刚在 Docker 文件中使用此命令将生成的 jssecacerts
文件复制到 Docker 图像中:
COPY ./res/jssecacerts /usr/lib/jvm/java-1.8-openjdk/jre/lib/security/
我有一个 Spring 引导 Java 应用程序,我想将其 运行 放入 Docker 容器中。该应用程序通过 HTTPS 与内部网络上的另一个服务通信,但是当我 运行 Docker 容器时,我得到以下异常(由 HTTPS 连接引起):
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
我的开发机器上也有同样的异常,我使用 this tutorial.
修复了这个异常我试过的
- 很多建议指出
DOCKER_CERT_PATH
变量需要正确设置,但是当我 运行docker-machine env default
时,我看到它指向C:\Users\username\.docker\machines\machine\default
. - 我尝试获取证书并使用 this advice 将其放入此文件夹
- 我尝试添加
-Dtrust_all_cert=true
Java 选项来禁用证书检查 - 我尝试使用
- 我关注了 this tutorial 并设法将证书添加到
/etc/ssl/certs/java/cacerts
以及 Docker 图像中的/usr/lib/jvm/java-1.8-openjdk/jre/lib/security/cacerts
。
org.spotify.dockerfile-maven-plugin
切换到 org.spotify.docker-maven-plugin
None 这些解决方案有效。
我的问题
我应该怎么做才能摆脱这个异常?
我的Docker文件(应用之前的解决方案后)
FROM openjdk:8-jdk-alpine
# to enable file writes
VOLUME /tmp
ADD target/trip-force-0.1.0.jar app.jar
# java cacerts
COPY ./res/timur.domain.local.cer /timur.domain.local.cer
ENV CACERTS /etc/ssl/certs/java/cacerts
RUN keytool -noprompt -import -alias timur -keystore ${CACERTS} -file /timur.domain.local.cer
ENV JAVA_OPTS="-Dtrust_all_cert=true"
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
最终成功的是解决方案,我可能一开始就应该尝试,因为它解决了我开发机器上的问题。
使用 this tutorial (and downloading the InstallCert.java file from here) 我刚刚在 Docker 文件中使用此命令将生成的 jssecacerts
文件复制到 Docker 图像中:
COPY ./res/jssecacerts /usr/lib/jvm/java-1.8-openjdk/jre/lib/security/