我正在基于 maven:3.6.0-jdk-11-slim 编写 Docker 映像,以便与我们的 Jenkins Pipeline 集成。我在一个防火墙非常严密的公司环境中工作,我需要添加证书才能从我们的 Nexus 服务器下载必要的依赖项。
但是,由于 Docker 在将文件复制到镜像时仅允许使用相对路径,因此我需要在与 Dockerfile 相同的目录中提供 ca.crt,从而将所有内容提交给 SCM,对此我并不感到兴奋。
我是不是太谨慎了,不愿意提交我们的 ca-cert?或者有没有一种解决方法可以让我使用构建服务器上已经存在的证书?
参考Dockerfile:
#
# Build Stage
#
FROM maven:3.6.0-jdk-11-slim
COPY ca.crt /usr/local/share/ca-certificates
RUN update-ca-certificates
COPY pom.xml /tmp/pom.xml
COPY settings.xml /usr/share/maven/ref/settings.xml
RUN mvn -f /tmp/pom.xml -X -s /usr/share/maven/ref/settings.xml clean package
免责声明我不确定这是否是提出此问题的正确论坛,如果不是,我会很乐意将其移走。
答案1
如果ca.crt
是公钥证书,则根据定义它是公开的,并且它不包含任何允许人们冒充具有相应私钥证书的服务器的信息。因此,将文件添加到存储库是安全的,但是...有一个更好的解决方案:
从服务器动态获取公钥证书。使用以下命令可以获取签署证书的 CA 的“自签名证书”的公钥:
echo quit | openssl s_client -showcerts -servername example.com -connect example.com:443 2>/dev/null | awk '/BEGIN/,/END/{ if(/BEGIN/){c=""};c=c $0 "\n"}END{print c}' >ca.crt || true
文件ca.crt
包含公钥证书。
这样,无论何时构建 docker 镜像,CA 的证书都会被“刷新”。