certificats SSL de conteneur Docker

87

Existe-t-il un moyen élégant d'ajouter des certificats SSL aux images provenant de docker pull ?.

Je recherche un moyen simple et reproductible d'ajouter un fichier dans / etc / ssl / certs et d'exécuter update-ca-certificates. (Cela devrait couvrir les images ubuntu et debian).

J'utilise docker sur CoreOS, et la machine coreos fait confiance aux certificats SSL nécessaires, mais les conteneurs docker n'ont évidemment que la valeur par défaut.

J'ai essayé d'utiliser docker run --entrypoint=/bin/bashpour ensuite ajouter le certificat et exécuter update-ca-certificates, mais cela semble remplacer définitivement le point d'entrée.

Je me demande également maintenant, serait-il plus élégant de simplement monter /etc/ssl/certssur le conteneur à partir de la copie des machines hôtes? Cela permettrait implicitement aux conteneurs de faire confiance aux mêmes choses que l'hôte.

Je travaille avec un proxy ennuyeux qui résigne tout: (. Ce qui casse SSL et rend les conteneurs assez étranges à utiliser.

Beau Trepp
la source
3
Avez-vous pensé à créer un Dockerfile qui utiliserait votre image, ajouterait le fichier et exécuterait update-ca-certificates? ou n'est-ce pas ce que vous recherchez?
Céline Aussourd
J'ai fait cela pour certaines images. Ce n'est pas une mauvaise solution. Cependant, vous devez construire sur toutes les images avec les vôtres.
Beau Trepp

Réponses:

75

Montez les certificats sur le conteneur Docker en utilisant -v:

docker run -v /host/path/to/certs:/container/path/to/certs -d IMAGE_ID "update-ca-certificates"
cdrev
la source
5
C'est assez chouette. Si le conteneur utilise le même style de ssl_certs, vous n'auriez même pas besoin de la ligne update-ca-certificates, l'hôte l'aurait déjà fait :).
Beau Trepp
2
et si nous construisons dans le cloud?
Ewoks
26

J'essaie de faire quelque chose de similaire. Comme commenté ci-dessus, je pense que vous voudriez créer une nouvelle image avec un Dockerfile personnalisé (en utilisant l'image que vous avez tirée comme image de base), ADDvotre certificat, puis RUN update-ca-certificates. De cette façon, vous aurez un état cohérent chaque fois que vous démarrez un conteneur à partir de cette nouvelle image.

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

Disons qu'un docker buildcontre ce Dockerfile a produit IMAGE_ID. Au suivant docker run -d [any other options] IMAGE_ID, le conteneur démarré par cette commande aura vos informations de certificat. Simple et reproductible.

Shudgston
la source
Habituellement, je préférerais la solution docker run -v mentionnée dans d'autres réponses. Mais votre solution fonctionne également si vous avez besoin de certificats lors de la construction de docker. Merci!
bastian
9
Je me méfierais de mettre des certificats dans n'importe quel conteneur public. Quelqu'un d'autre pourrait extraire votre conteneur et extraire vos certificats privés.
skibum55
4
Bien que ce soit un très bon point, la solution ci-dessus ne rend rien public. Cela vise à ajouter vos propres certificats dans une image qui est créée localement puis utilisée en privé. Vous pouvez ensuite pousser l'image résultante vers un référentiel public, mais ce serait une mauvaise idée comme vous l'avez dit.
shudgston le
9
Depuis quand les certificats sont-ils secrets?
techraf
3
Étant donné que votre serveur a besoin d'une clé privée pour correspondre au certificat qu'il publie.
John Rix
21

Comme suggéré dans un commentaire ci - dessus , si le magasin de certificats sur l'hôte est compatible avec l'invité, vous pouvez simplement le monter directement.

Sur un hôte (et un conteneur) Debian, j'ai réussi:

docker run -v /etc/ssl/certs:/etc/ssl/certs:ro ...
Jonathon Reinhart
la source
Alors, que faire lors de la création d'une image Docker sur le serveur de build? : /
Ewoks
@Ewoks Vous pouvez héberger vos certificats sur certains DNS privés et les charger dans vos graphiques de barre et vous pouvez automatiser la création du volume sur votre cluster.
Bassam Gamal
0

Vous pouvez utiliser le chemin relatif pour monter le volume sur le conteneur:

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

Notez la coche arrière sur le pwdqui vous donne le répertoire de travail actuel. Cela suppose que vous avez le certsdossier dans le répertoire actuel dans lequel docker runest exécuté. Un peu génial pour le développement local et gardez le dossier des certificats visible pour votre projet.

alltej
la source