сертифікати ssl контейнера


87

Чи є якийсь елегантний спосіб додати ssl-сертифікати до зображень, отриманих від docker pull ?.

Я шукаю простий і відтворюваний спосіб додавання файлу в / etc / ssl / certs та запуск update-ca-сертифікатів. (Це повинно охоплювати образи ubuntu та debian).

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

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

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

Я працюю з надокучливим проксі-сервером, який все звільняє :(. Що порушує SSL і робить контейнери якимись дивними для роботи.


3
Ви задумувались над створенням файлу Docker, який використовував би ваш образ, додавав файл та запускав update-ca-сертифікати? чи це не те, що ви шукаєте?
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-certificate, хост вже це зробив :).
Beau Trepp

2
а якщо ми будуємо в хмарі?
Ewoks,

26

Я намагаюся зробити щось подібне до цього. Як зазначалося вище, я думаю, ви хотіли б створити нове зображення за допомогою власного файлу Docker (використовуючи зображення, яке ви витягли як базове зображення) 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, згаданому в інших відповідях. Але ваше рішення також працює, якщо вам потрібні сертифікати під час створення докера. Дякую!
Бастіан

9
Я був би обережний, щоб помістити сертифікати в будь-який публічний контейнер. Хтось інший міг витягнути ваш контейнер і витягти ваші приватні сертифікати.
skibum55

4
Хоча це дуже хороший момент, наведене вище рішення не робить нічого публічним. Це призначено для додавання власних сертифікатів до зображення, яке створюється локально, а потім використовується приватно. Потім ви можете надсилати отримане зображення до загальнодоступного сховища, але це було б поганою ідеєю, як ви сказали.
shudgston

9
З якого часу сертифікати є секретними?
techraf

3
Оскільки вашому серверу потрібен приватний ключ, щоб відповідати сертифікату, який він публікує.
Джон Рікс,

21

Як було запропоновано у коментарі вище , якщо сховище сертифікатів на хості сумісне з гостем, ви можете просто змонтувати його безпосередньо.

На хості Debian (і контейнері) я успішно зробив:

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

Отже, що робити при побудові образу Docker на сервері збірки? : /
Ewoks

@Ewoks Ви можете розміщувати свої сертифікати на деяких приватних DNS і завантажувати їх у свої діаграми керма, і ви можете автоматизувати створення тома на своєму кластері.
Bassam Gamal

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.