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"
cdrev
источник
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контейнер, запущенный этой командой, будет иметь информацию о вашем сертификате. Просто и воспроизводимо.

Shudgston
источник
Обычно я бы предпочел решение 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которой выполняется. Отлично подходит для локальной разработки и сохраняет папку сертификатов видимой для вашего проекта.

Alltej
источник