将自签名证书导入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
对于使用jenkins , sonarqube或nexus等已configuration的基于java的容器(例如,如果您运行自己的构build服务器),我发现使用docker run参数将合适的cacerts
文件装载到这些容器中会更方便。
我使用openjdk的cacerts
文件作为基础:
- 使用临时容器从openjdk映像中提取
cacerts
:
docker pull openjdk:latest docker run --rm --entrypoint cat openjdk:latest /etc/ssl/certs/java/cacerts > cacerts
- 使用从包含
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'
- 运行您的目标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
),您不需要使用Dockerfile
和Dockerfile
docker build
来创build自己的图像。
- 用于确定性CI构build的便携式docker守护程序
- 如何在docker中为postgres运行sql脚本
- 持久数据的Docker卷 – 是否足以仅传递容器path?
- SeleniumHQ泊坞窗图像创buildseleniumselenium网格的seleniumpythontesting
- 在Docker中运行一个可执行的二进制文件(带有JET Excelsior)
- docker专用registry用户创build
- 在Kubernetes或Google Container Engine中等待作业/ Pod完成
- API服务器无法启动
- 如何使用Docker Remote API从Linux容器到它的Windows主机