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

  • 一个Java服务在Docker容器中运行,它访问外部HTTPS URL,并且其自签名证书对于服务/ JRE cacert密钥库不可用,因此连接失败。
  • 因此,将HTTPS外部URL的自签名证书导入到Docker容器的JRE cacert密钥库中。 (在检查$ JAVA_HOME env。variables之后)
  • 重新启动Docker容器(使用“docker restart”命令),希望服务也重启,并从JRE cacert中select更改。 但是这并没有发生,Java服务仍然无法访问外部的HTTPS URL。

任何想法如何运行在Docker容器内的Java服务select新的证书导入JRE cacert更改?

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

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

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

像这样的答案 :

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 

对于使用jenkinssonarqubenexus等已configuration的基于java的容器(例如,如果您运行自己的构build服务器),我发现使用docker run参数将合适的cacerts文件装载到这些容器中会更方便。

我使用openjdkcacerts文件作为基础:

  1. 使用临时容器从openjdk映像中提取cacerts
 docker pull openjdk:latest docker run --rm --entrypoint cat openjdk:latest /etc/ssl/certs/java/cacerts > cacerts 
  1. 使用从包含ldap.cer的相同文件夹启动的临时容器向提取的cacerts添加证书:
 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集装箱(s)安装提取cacerts与运行参数,例如sonarqube
 docker run ... -v /path/to/your/prepared/cacerts:/etc/ssl/certs/java/cacerts:ro ... sonarqube:lts 

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

为了更新目标图像(例如sonarqube ),您不需要使用DockerfileDockerfile docker build来创build自己的图像。