无法将证书添加到 alpine linux 容器

Posted

技术标签:

【中文标题】无法将证书添加到 alpine linux 容器【英文标题】:unable to add certificates to alpine linux container 【发布时间】:2019-02-20 15:31:12 【问题描述】:

我在 alpine linux 容器中有一个小型 python 应用程序,这里是 dockerfile:

FROM alpine

# basic flask environment
RUN apk add --no-cache bash git nginx uwsgi uwsgi-python py2-pip \
    && pip2 install --upgrade pip \
    && pip2 install flask

# application folder
ENV APP_DIR /app
ENV FLASK_APP app.py

# app dir
RUN mkdir $APP_DIR \
    && chown -R nginx:nginx $APP_DIR \
    && chmod 777 /run/ -R \
    && chmod 777 /root/ -R
VOLUME [$APP_DIR]
WORKDIR $APP_DIR

# copy config files into filesystem
COPY nginx.conf /etc/nginx/nginx.conf
COPY app.ini /app.ini
COPY entrypoint.sh /entrypoint.sh

RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/*
COPY ./cert.pem /usr/local/share/ca-certificates/mycert.pem
COPY ./key.pem /usr/local/share/ca-certificates/mykey.pem
COPY ./ssl_password_file.pass /etc/keys/global.pass
RUN update-ca-certificates

COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
EXPOSE 5000
ENTRYPOINT ["/entrypoint.sh"]

这在 2 周前运行良好,但是当我最近尝试重建它时,我收到了这个错误:

WARNING: ca-certificates.crt does not contain exactly one certificate or CRL: skipping
WARNING: ca-cert-mykey.pem.pem does not contain exactly one certificate or CRL: skipping

所以我检查了这些文件,发现由于某种原因,现在文件 ca-certificates.crt 现在有一个证书链。 我在堆栈溢出时找到了this:

/etc/ssl/certs/ca-certificates.crt 实际上是附加每个 来自 /usr/local/share/ca-certificates 的个人证书。

但是发生了什么变化?为什么这是一个问题? 所以我尝试恢复到旧版本的 alpine linux - 同样的问题。 我尝试重新创建证书,我尝试从容器中删除一大堆证书,我在更新之前检查了 pem 文件以确保它们只是一个证书,并且显然是在运行之后直接

RUN update-ca-certificates

出现许多证书。 帮忙?

【问题讨论】:

【参考方案1】:

警告:ca-certificates.crt 不包含一个证书或 CRL:正在跳过

警告:ca-cert-mykey.pem.pem 不包含一个证书或 CRL:正在跳过

OP 提到了两个警告,其中包括要添加的 pem 文件。只有第一个警告可以忽略。第二个警告是由包含多个证书的 pem 文件引起的,该文件完全有效,但 update-ca-certificates 处理不当。

相反,您可以直接附加证书文件的内容:

cat ca-cert-mykey.pem.pem >> /etc/ssl/certs/ca-certificates.crt

CI 配置的另一个用例:

echo "$ADDITIONAL_CA_CERT_BUNDLE" >> /etc/ssl/certs/ca-certificates.crt

【讨论】:

【参考方案2】:

就我而言,我必须在添加任何包之前执行update-ca-certificates。但如果/etc/ssl/certs/ 不存在,它就会失败。

所以,我在我的 Dockerfile 中的 RUN apk add ... 之前添加了 RUN mkdir -p /etc/ssl/certs/ && update-ca-certificates

【讨论】:

【参考方案3】:

我认为下面对我有用(我在从 alpine 扩展的 blackfire/blackfire 图像上添加了根证书):

RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/* \
  mkdir /usr/local/share/ca-certificates/extra
COPY .docker/other/cert_Intertrials-CA.crt /usr/local/share/ca-certificates/extra
RUN update-ca-certificates

然后我登录该虚拟机并看到它已将其添加到合并的证书文件 /etc/ssl/certs/ca-certificates.crt(我相信我听说它从 /usr/local/ 中获取每个证书文件share/ca-certificates 并合并到 /etc/ssl/certs/ca-certificates.crt 文件中)。

现在您可能会收到“不包含完全一个证书或 CRL:跳过”错误,但我听说这很好。

https://github.com/gliderlabs/docker-alpine/issues/30 提到:“这只是一个警告,不应该影响任何事情。”

https://github.com/gliderlabs/docker-alpine/issues/52 提到: “警告:ca-certificates.crt 不包含一个证书或 CRL:跳过就是它所说的,一个警告。它是说 ca-certificates.crt 不只包含一个证书(因为它是所有证书的串联),因此它被跳过并且不包含在 ca-certificates.crt 中(因为它不能包含自身)。” "显示的警告是正常的。"

【讨论】:

根据我的经验,这在 alpine linux 中不起作用。如here 所述,您不得将自定义证书文件放在/usr/local/share/ca-certificates 的子目录中。 不确定,为我工作,到目前为止获得了 12 个赞。也许人们只是稍微修改我的 COPY 步骤(通过删除额外的/): COPY .docker/other/YOURCERT.crt /usr/local/share/ca-certificates/ 我可以确认(对我而言),在当前的 alpine 上,证书必须添加到 /usr/local/share/ca-certificates 而不是 /usr/local/share/ca-certificates/extra 目录。 这似乎取决于您的发行版本。现在使用doptopenjdk/openjdk11:alpine-jre,它是强制性的。我以前使用过 anapsix/alpine-java:8u192b12_server-jre 将证书复制到 /usr/local/share/ca-certificates/ 就足够了 这不仅仅是对 Alpine 3.13 的警告,这不起作用

以上是关于无法将证书添加到 alpine linux 容器的主要内容,如果未能解决你的问题,请参考以下文章

无法在基于 Alpine 的 Docker 容器中运行 Play 框架应用程序

Alpine Linux 处理证书的方式与 Busybox 不同吗?

当我使用 Alpine 作为基础镜像时,如何添加用户?

alpine linux怎么安装软件

在 Alpine Linux 中安装 bash shell

将 SSL 证书添加到 mysql docker 容器