将自签名证书导入 Docker 的 JRE cacert 服务无法识别

新手上路,请多包涵
  • Java 服务在 Docker 容器内运行,该服务访问外部 HTTPS url,并且其自签名证书对服务/JRE cacert 密钥库不可用,因此连接失败。
  • 因此将 HTTPS 外部 URL 的自签名证书导入到 Docker 容器的 JRE cacert 密钥库中。 (检查 $JAVA_HOME 变量后)
  • 重新启动 Docker 容器(使用 docker restart 命令),希望服务也重新启动并从 JRE cacert 中选择更改。但这并没有发生,Java 服务仍然无法访问外部 HTTPS URL。

知道在 Docker 容器内运行的 Java 服务如何选择 JRE cacert 随着新证书导入的变化吗?

原文由 Zeigeist 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 866
2 个回答

因此将 HTTPS 外部 URL 的自签名证书导入到 Docker 容器的 JRE cacert 密钥库中。

否:您需要将其导入到运行容器的 Docker 映像 中。

将其导入容器只会创建一个 临时的可写数据层,当您重新启动容器时该数据层将被丢弃。

这样的答案

 USER root
COPY ldap.cer $JAVA_HOME/jre/lib/security
RUN \
    cd $JAVA_HOME/jre/lib/security \
    && keytool -keystore cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias ldapcert -file ldap.cer

原文由 VonC 发布,翻译遵循 CC BY-SA 3.0 许可协议

对于使用已配置的基于 java 的容器,如 jenkinssonarqubenexus (例如,如果您运行自己的构建服务器),我发现将合适的 cacerts 文件挂载到这些容器中更方便,并带有 docker run 的参数.

我使用来自 openjdkcacerts 文件作为基础:

  1. 使用临时容器从 openjdk 映像中提取 cacerts
 docker pull openjdk:latest
docker run --rm --entrypoint cat openjdk:latest /etc/ssl/certs/java/cacerts > cacerts

  1. 使用从同一文件夹启动的临时容器将证书添加到提取的 cacerts 中,该文件夹还包含 ldap.cer
 docker run --rm -v `pwd`:/tmp/certs openjdk:latest bash -c 'cd /tmp/certs && keytool -keystore cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias buenting-root -file ldap.cer'

  1. 运行您的目标 docker 容器,使用运行参数安装提取的 cacerts ,例如 sonarqube
 docker run ... -v /path/to/your/prepared/cacerts:/etc/ssl/certs/java/cacerts:ro ... sonarqube:lts

如果有新版本的 openjdk ,您可以使用 1. 和 2 中的命令更新主机上的 cacerts 文件。

要更新目标图像(例如 sonarqube ),您不需要使用 Dockerfiledocker build 创建自己的图像。

原文由 Volker Seibt 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题