SSL-сертификаты контейнера докеров


87

Есть ли элегантный способ добавить ssl-сертификаты к изображениям, полученным из docker pull?

Я ищу простой и воспроизводимый способ добавления файла в / etc / ssl / certs и запуска update-ca-Certificates. (Это должно охватывать образы ubuntu и debian).

Я использую докер в CoreOS, и машина coreos доверяет необходимым сертификатам ssl, но контейнеры докеров, очевидно, имеют только значение по умолчанию.

Я пробовал использовать, docker run --entrypoint=/bin/bashчтобы затем добавить сертификат и запустить update-ca-certificates, но, похоже, это навсегда переопределит точку входа.

Мне также интересно, было бы более элегантным просто смонтировать /etc/ssl/certsконтейнер из копии хост-машины? Это неявно позволит контейнерам доверять тем же вещам, что и хост.

Я работаю с надоедливым прокси, который отказывается от всего :(. Который ломает SSL и делает работу с контейнерами странной.


3
Вы думали о создании Dockerfile, который будет использовать ваш образ, добавлять файл и запускать update-ca-Certificates? или это не то, что вы ищете?
Céline Aussourd

Я сделал это для некоторых изображений. Неплохое решение. Тем не менее, требуется, чтобы вы создавали все изображения с собственными.
Beau Trepp

Ответы:


75

Установите сертификаты в контейнер Docker, используя -v:

docker run -v /host/path/to/certs:/container/path/to/certs -d IMAGE_ID "update-ca-certificates"

5
Это довольно здорово. Если контейнер использует тот же стиль ssl_certs, вам даже не понадобится строка update-ca-Certificts, хост уже сделал бы это :).
Beau Trepp

2
а если мы строим в облаке?
Ewoks

26

Я пытаюсь сделать что-то подобное. Как отмечалось выше, я думаю, вы захотите создать новый образ с пользовательским Dockerfile (используя изображение, которое вы вытащили в качестве базового образа) ADD, а затем свой сертификат RUN update-ca-certificates. Таким образом, у вас будет постоянное состояние каждый раз, когда вы запускаете контейнер из этого нового образа.

# Dockerfile
FROM some-base-image:0.1
ADD you_certificate.crt:/container/cert/path
RUN update-ca-certificates

Скажем, docker buildпротив того, что Dockerfile создал IMAGE_ID. В следующий раз docker run -d [any other options] IMAGE_IDконтейнер, запущенный этой командой, будет иметь информацию о вашем сертификате. Просто и воспроизводимо.


Обычно я бы предпочел решение docker run -v, упомянутое в других ответах. Но ваше решение также работает, если вам нужны сертификаты во время сборки докера. Благодарность!
Bastian 05

9
Я бы опасался помещать сертификаты в любой публичный контейнер. Кто-то другой может вытащить ваш контейнер и извлечь ваши частные сертификаты.
skibum55 01

4
Хотя это очень хороший момент, вышеприведенное решение не делает ничего публичного. Это предназначено для добавления ваших собственных сертификатов в образ, который создается локально и затем используется в частном порядке. Затем вы можете отправить полученное изображение в публичный репозиторий, но, как вы сказали, это будет плохой идеей.
shudgston

9
С каких это пор сертификаты засекречены?
techraf

3
Поскольку вашему серверу нужен закрытый ключ, соответствующий сертификату, который он публикует.
Джон Рикс

21

Как было предложено в комментарии выше , если хранилище сертификатов на хосте совместимо с гостевой, вы можете просто подключить его напрямую.

На хосте Debian (и контейнере) я успешно сделал:

docker run -v /etc/ssl/certs:/etc/ssl/certs:ro ...

Итак, что делать при создании образа Docker на сервере сборки? : /
Ewoks

@Ewoks Вы можете разместить свои сертификаты на каком-то частном DNS и загрузить их в свои схемы управления, и вы можете автоматизировать создание тома в своем кластере.
Бассам Гамаль

0

Вы можете использовать относительный путь для подключения тома к контейнеру:

docker run -v `pwd`/certs:/container/path/to/certs ...

Обратите внимание на обратную галочку, pwdкоторая дает вам текущий рабочий каталог. Предполагается, что certsв текущем каталоге у вас есть папка, в docker runкоторой выполняется. Отлично подходит для локальной разработки и сохраняет папку сертификатов видимой для вашего проекта.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.