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

k3fezbri  于 2022-11-14  发布在  Linux
关注(0)|答案(5)|浏览(400)

我在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证书. crt实际上附加了/usr/local/share/ca证书中的每个单独的证书。
但是什么改变了?为什么现在这是一个问题?所以我尝试恢复到一个旧版本的alpine linux -同样的问题。我尝试重新创建证书,我尝试从容器中删除一大堆证书,我在更新前检查了pem文件,以确保它们只是一个证书,显然是直接在运行后

RUN update-ca-certificates

将显示许多证书。帮助?

pieyvz9o

pieyvz9o1#

我认为下面的工作为我(我正在添加一个根证书的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:可能是skipping'错误,但我听说那是好的。
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中(因为它不能包含自身)。”
“显示的警告是正常的。”

ggazkfy8

ggazkfy82#

警告: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
bzzcjhmw

bzzcjhmw3#

在我的例子中,我必须在添加任何包之前执行update-ca-certificates,但是如果/etc/ssl/certs/不存在,它就会失败。
因此,我在我的Dockerfile中的RUN apk add ...之前添加了RUN mkdir -p /etc/ssl/certs/ && update-ca-certificates

np8igboo

np8igboo4#

我就是这样的

ADD .docker/cert/root2022.cer /usr/local/share/ca-certificates/root2022.cer
RUN openssl x509 -inform PEM -in /usr/local/share/ca-certificates/root2022.cer -out /usr/local/share/ca-certificates/certificate.crt
RUN chmod 644 /usr/local/share/ca-certificates/certificate.crt && update-ca-certificates
rn0zuynd

rn0zuynd5#

有点跑题了,因为OP请求alpine的帮助,而我在我的dockerfile中使用node:16作为基础映像,但我想分享我的案例作为先例。我正确安装了我的RootCA,但除了“正常”警告之外,我的容器没有接受新证书,即使它在/etc/ssl/certs/ca-certificates.crt中被索引。
我从三个小时前就开始纠结这个毫无意义的错误;所以,我只是移动到节点:18-bullseye(或更大),然后正确安装证书。

相关问题