将自签名证书导入Docker';服务无法识别s JRE cacert Docker容器中正在运行Java服务,该容器访问外部HTTPS url,其自签名证书对服务/JRE cacert密钥库不可用,因此连接失败 因此,将HTTPS外部URL的自签名证书导入Docker容器的JRE cacert密钥库。(检查$JAVA_HOME环境变量后) 重新启动Docker容器(使用Docker restart命令),希望服务也能重新启动,并从JRE cacert中选择更改。但这并没有发生,Java服务仍然无法访问外部HTTPS URL
知道Docker容器中运行的Java服务如何通过新证书导入选择JRE cacert更改吗 因此,将HTTPS外部URL的自签名证书导入Docker容器的JRE cacert密钥库 否:您需要将其导入到运行容器的Docker映像中 将其导入容器只会创建一个,当您重新启动容器时,将丢弃该文件 比如:将自签名证书导入Docker';服务无法识别s JRE cacert Docker容器中正在运行Java服务,该容器访问外部HTTPS url,其自签名证书对服务/JRE cacert密钥库不可用,因此连接失败 因此,将HTTPS外部URL的自签名证书导入Docker容器的JRE cacert密钥库。(检查$JAVA_HOME环境变量后) 重新启动Docker容器(使用Docker restart命令),希望服务也能重新启动,并从JRE cacert中选择更改。但这并没有发生,Java服务仍然无法访问外部HTTPS URL,java,docker,https,docker-compose,docker-machine,Java,Docker,Https,Docker Compose,Docker Machine,知道Docker容器中运行的Java服务如何通过新证书导入选择JRE cacert更改吗 因此,将HTTPS外部URL的自签名证书导入Docker容器的JRE cacert密钥库 否:您需要将其导入到运行容器的Docker映像中 将其导入容器只会创建一个,当您重新启动容器时,将丢弃该文件 比如: 对于使用已经配置好的基于java的容器,如jenkins、sonarqube或nexus(例如,如果您运行自己的构建服务器),我发现使用docker run的参数将合适的cacerts-文件装入这些容器
对于使用已经配置好的基于java的容器,如jenkins、sonarqube或nexus(例如,如果您运行自己的构建服务器),我发现使用docker run的参数将合适的
cacerts
-文件装入这些容器更方便
我使用openjdk中的cacerts
文件作为基础:
cacerts
:cacerts
,该临时容器从同样包含ldap.cer的文件夹启动:
cacerts
。G对于声纳qube
:cacerts
-文件。二,
为了更新目标映像(例如,
sonarqube
),您不需要使用Dockerfile
和docker build
来创建自己的映像。下面是一个适用于基于OpenJDK Java 11的映像的解决方案
前面要提到的一点是,您可以使用JDK映像或JRE。第二个选项需要安装ca证书java
- 基于JDK的映像的
:Dockerfile
对于基于JRE的图像:Dockerfile
此外,正如您从Dockerfiles上面的说明中所看到的,它们都要求您的
证书.crt
文件位于同一个文件夹中。您刚才未选择的答案是否缺少任何内容?这太神奇了。在您的图像提供商决定更改Java版本之前,这可能可以正常工作。使用旧的cacerts
文件可能会产生不可预见的后果,包括信任不应再信任的CA。为了避免这种情况,您必须跟踪感兴趣的映像中的Java版本更改,并在发生这种情况时提取新文件。正因为如此,它变得不再那么方便了。有了新的java版本,您只需更新docker主机上的cacerts文件,甚至不必替换映像或容器。那么所使用的证书甚至可能比图像中提供的证书更新。@VolkerSeibt如果我在docker图像中有一个我需要的自签名证书,这是否有效?如果我在Dockerfile中提到证书并运行keypass,它就可以正常工作。但是,我想要一个解决方案,这样我就不需要修改图像。我想在运行我的容器时提到证书。@Anthony最新的命令旨在运行您的目标容器,然后使用docker主机上保存的cacerts文件。不需要修改图像。太棒了!我曾在DEBIAN上运行的docker上使用DER加密证书进行过尝试,效果非常好。我认为这是最好的解决方案,只需将证书导出为base-64编码的X.509,以避免复制二进制文件的麻烦file@Dojo我想我的意思是在停止并移除旧容器后重新启动一个新容器。@Archmede我没有:你可以考虑把这个当作一个单独的问题。这么多的搜索和这个单一的命令是所有的,这是我的证书似乎有错误的日期,当我尝试使用它在码头工人文件。你遇到过这个问题吗?@Archmede这是什么意思?日期不对?。不,我没有。@povisenki我的应用程序抛出一个错误,指出我的证书在5天前过期,即使它将在5天后过期years@Archmede我可以建议您创建一个问题,以便您可以提供有关您使用的证书和代码的公共信息
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
docker pull openjdk:latest
docker run --rm --entrypoint cat openjdk:latest /etc/ssl/certs/java/cacerts > 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 run ... -v /path/to/your/prepared/cacerts:/etc/ssl/certs/java/cacerts:ro ... sonarqube:lts
FROM openjdk:11-jdk-slim
WORKDIR /opt/workdir/
#.crt file in the same folder as your Dockerfile
ARG CERT="certificate.crt"
#import cert into java
COPY $CERT /opt/workdir/
RUN keytool -importcert -file $CERT -alias $CERT -cacerts -storepass changeit -noprompt
...
FROM openjdk:11-jre-slim
WORKDIR /opt/workdir/
#.crt file in the same folder as your Dockerfile
ARG CERT="certificate.crt"
#installing ca-certificates-java and then import cert into java
COPY $CERT /opt/workdir/
RUN mkdir -p /usr/share/man/man1 \
&& apt-get update \
&& apt-get install -y ca-certificates-java \
&& keytool -importcert -file $CERT -alias $CERT -cacerts -storepass changeit -noprompt
...