JDK 10模块和sun.security.provider.certpath.SunCertPathBuilderException

3

我曾经在openjdk:10-slim docker 镜像上运行我的应用程序,一切都很顺利。

然后我迁移到了一个使用Jlink构建的自定义JDK,以下是Dockerfile:

FROM openjdk:10-jdk-slim AS jdkBuilder

RUN $JAVA_HOME/bin/jlink \
--module-path /opt/jdk/jmods \
--verbose \
--add-modules java.base,java.logging,java.xml,java.xml.bind,java.sql,jdk.unsupported,java.naming,java.desktop,java.management,java.security.jgss,java.security.sasl,jdk.crypto.cryptoki,jdk.crypto.ec,java.instrument,jdk.management.agent \
--output /opt/jdk-minimal \
--compress 2 \
--no-header-files


FROM debian:9-slim
COPY --from=jdkBuilder /opt/jdk-minimal /opt/jdk-minimal

ENV JAVA_HOME=/opt/jdk-minimal
COPY target/*.jar /opt/

CMD $JAVA_HOME/bin/java $JAVA_OPTS -jar /opt/*.jar

一般情况下都正常工作,但在使用AWS S3 SDK时出现以下异常:

com.amazonaws.SdkClientException: Unable to execute HTTP request: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

我猜测这些证书(或访问它们的方式)是由一个缺失的包提供的,而我没有包含它。
我做了一些调查,但没有找到任何关于它的信息。我尝试添加与安全或SSL相关的任何模块,但都没有成功。
有人遇到过这个问题并知道需要添加哪个模块吗?作为一种解决方法,我回退到openjdk:10-slim,但我想使用jlink因为它可以使我的镜像更小。

2
尝试将 cacerts 从 openjdk:10-slim 复制到 JDK。 - Fran Montero
好主意,让我试试看。 - phoenix7360
1
@FranMontero,谢谢你的帮助。你想写一个答案,还是我用我对Docker文件所做的更改来写一个答案? - phoenix7360
刚刚写了一个 :D。很高兴能帮到你! - Fran Montero
1个回答

3

异常提示您的环境缺少一些根证书。

尝试从openjdk:10-slim复制cacerts到您正在使用的JDK中。


3
为了参考,我通过在Dockerfile中添加以下行来实现:COPY --from=jdkBuilder /docker-java-home/lib/security/cacerts /opt/jdk-minimal/lib/security/cacerts - phoenix7360

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接