【问题标题】:Docker: Insert certificate into ketstoreDocker:将证书插入密钥库
【发布时间】:2018-12-21 17:35:38
【问题描述】:

我正在尝试将证书添加到我的 Dockerfile 上的 $JAVA_HOME/jre/lib/security/cacerts 信任库中:

FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
RUN keytool -import -alias vault -storepass changeit -keystore $JAVA_HOME/jre/lib/security/cacerts -noprompt -trustcacerts -file /var/run/secrets/kubernetes.io/certs/tls.crt
ADD wseccloudconfig-0.0.1-SNAPSHOT.jar app.jar
RUN sh -c 'touch /app.jar'
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

如您所见,我正在执行命令keytool... 以便将证书插入cacerts

我正在将此映像部署到我的 openshift/kubernetes 集群中。一旦我连接到 pod shell,我就可以正确地运行这个 keytool... 命令。所以我的意思是,命令格式正确。没有语法问题或相关问题...

所以,除了这个命令的输出:keytool -list -keystore $JAVA_HOME/jre/lib/security/cacerts 出现了我的证书,但它没有出现。

有什么想法吗?

编辑

我也试过在Dockerfile写这个:

CMD ["keytool", "-import", "-alias", "vault", "-storepass", "changeit", "-keystore", "$JAVA_HOME/jre/lib/security/cacerts", "-noprompt", "-trustcacerts", "-file", "/var/run/secrets/kubernetes.io/certs/tls.crt"]

【问题讨论】:

  • 也许您应该在运行 keytool 命令之前将文件 /var/run/secrets/kubernetes.io/certs/tls.crt 复制到容器中。
  • 不可能。此文件 (tls.crt) 在安装卷时提供。它在构建时不可用。我也试过CMD。见后版。
  • 为什么证书不是 jks 格式? @user10063942
  • 如果在构建时它不可用,keytool 导入将无法工作。修改您的入口点,使其成为一个脚本,该脚本首先导入证书然后运行您的 jar。
  • 我认为解决方案是添加CMD而不是更改ENTRYPOINT

标签: java docker kubernetes openshift dockerfile


【解决方案1】:

就像评论中已经说过的那样 - 如果你想使用在部署时挂载的 crt 文件,你必须将 keytool 命令添加到部署中。

您在构建容器时尝试访问的 crt 尚不存在。

【讨论】: