Я хочу создать базовый образ Alpine, который извлекает ВСЕ ресурсы через мой внутренний Artifactory без моих сертификатов. Но подождите ... как я могу подключиться к своему внутреннему Artifactory без update-ca-certificates? Получите ВСЕ альпийские ресурсы из Artifactory, без исключений.

Если в вашей компании нет ограничений на получение ресурсов из открытого Интернета, тогда все в порядке. В противном случае продолжайте читать.

Ужасная локальная проблема

У меня есть:

  • Внутренний экземпляр GitLab
  • Внутренний Artifactory (с удаленным репозиторием, указывающим на CDN Alpine)
  • Внутренние самоподписанные сертификаты

Мои желания:

  1. Используйтеalpine как базовое изображение с любой версией с тегами.
  2. Добавьте мои внутренние сертификаты.
  3. Устанавливайте все зависимости и пакеты с помощью внутреннего экземпляра Artifactory только в соответствии с моей строгой политикой компании.

Решения там:

Большинство решений, с которыми я столкнулся, были связаны с копированием ваших сертификатов в изображение и простым запуском apk add ca-certificates && update-ca-certificates. Это не работает, потому что мне нужно будет подключиться к Alpine CDN, чтобы получить CA-сертификаты; Это противоречит политике моей компании.

Я не могу изменить URL-адреса репозитория Artifactory до apk add, потому что сертификаты не будут проверены.

Мои неудачные попытки:

В Apk есть команда fetch, которая позволяет загрузить пакет без установки.

apk fetch ca-certificates

Цель заключалась в том, чтобы управлять версиями файла .apk и устанавливать его локально.

apk add --no-cache --no-network --repositories-file=/dev/null --allow-untrusted /tmp/ca-certificates-20190108-r0.apk

Проблема заключалась в том, что полученный пакет не соответствовал между версиями Alpine или, скорее, зависимостями (в частности, libcrypto). Пакет, загруженный из v3.10, не будет работать в v3.7.

Рабочий раствор

Поскольку apk add не имеет параметра для указания сертификата, единственный способ - установить его как системный сертификат. Я бы обошелся без update-ca-certificates. Я не буду углубляться в сценарий, я останусь на высоком уровне.

Во-первых, предполагается, что все ваши сертификаты находятся здесь: /usr/local/share/ca-certificates. Выполните со своим сертификатом следующее:

update-ca-certificates
grep -rnw -e "<insert your cert snippet>" /etc/ssl/certs/

update-ca-certificates берет все действительные сертификаты из этого каталога и добавляет их в /etc/ssl/certs/ca-certificates.crt. Это первая часть.

Затем делается 2 копии сертификата. Один на /etc/ssl/certs/ca-root-jack.pem (мой сертификат был назван jack.crt), а другой с хешем /etc/ssl/certs/597c82bf.0 (я не понял, как этот хеш создается).

Затем нужно создать свой Dockerfile на основе собранной информации.

FROM alpine:3.1
COPY --from=git.local/internal-certs:latest /certs /usr/local/share/ca-certificates/
RUN cat /usr/local/share/ca-certificates/caroot-ROOT-CA.crt >> /etc/ssl/certs/ca-certificates.crt 
    cp /usr/local/share/ca-certificates/caroot-ROOT-CA.crt /etc/ssl/certs/ca-cert-root.pem && \
    cat /usr/local/share/ca-certificates/caroot-sna01_PAC-ROOT-CA.crt > /etc/ssl/certs/597c82bf.0 && \
    sed -i -e 's/http:\/\/dl-cdn\.alpinelinux\.org/https:\/\/artifactory.local\/artifactory/g' /etc/apk/repositories && \
    apk add --no-cache ca-certificates curl git && \
    update-ca-certificates

Предложения

Не стесняйтесь писать DM или комментировать лучший маршрут, если он у вас есть. :)