certificados SSL do docker container

87

Existe alguma maneira elegante de adicionar certificados SSL a imagens que vieram do docker pull ?.

Estou procurando uma maneira simples e reproduzível de adicionar um arquivo em / etc / ssl / certs e executar update-ca-certificates. (Isso deve abranger imagens do Ubuntu e debian)

Estou usando o docker no CoreOS e a máquina coreos confia nos certificados SSL necessários, mas os contêineres do docker obviamente só têm o padrão.

Tentei usar docker run --entrypoint=/bin/bashpara adicionar o cert e executar update-ca-certificates, mas isso parece substituir permanentemente o ponto de entrada.

Também estou me perguntando agora, seria mais elegante apenas montar /etc/ssl/certsno contêiner a partir da cópia das máquinas host? Isso permitiria implicitamente que os contêineres confiassem nas mesmas coisas que o host.

Estou trabalhando com um proxy chato que cancela tudo :(. Que quebra SSL e torna os contêineres meio estranhos para trabalhar.

Beau Trepp
fonte
3
Você já pensou em criar um Dockerfile que usaria sua imagem, adicionaria o arquivo e executaria update-ca-certificates? ou não é isso que você está procurando?
Céline Aussourd
Eu fiz isso para algumas imagens. Não é uma solução ruim. Requer que você construa em todas as imagens com as suas próprias.
Beau Trepp

Respostas:

75

Monte os certificados no contêiner Docker usando -v:

docker run -v /host/path/to/certs:/container/path/to/certs -d IMAGE_ID "update-ca-certificates"
cdrev
fonte
5
Isso é muito bacana. Se o contêiner usar o mesmo estilo de ssl_certs, você nem precisaria da linha update-ca-certificates, o host já teria feito isso :).
Beau Trepp
2
e se estamos construindo na nuvem?
Ewoks de
26

Estou tentando fazer algo semelhante a isso. Conforme comentado acima, acho que você gostaria de construir uma nova imagem com um Dockerfile personalizado (usando a imagem que você puxou como imagem base), ADDseu certificado, então RUN update-ca-certificates. Dessa forma, você terá um estado consistente cada vez que iniciar um contêiner a partir dessa nova imagem.

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

Digamos que um docker buildcontra esse Dockerfile produziu IMAGE_ID. No próximo docker run -d [any other options] IMAGE_ID, o container iniciado por aquele comando terá as informações do seu certificado. Simples e reproduzível.

Shudgston
fonte
Normalmente, eu preferiria a solução docker run -v mencionada em outras respostas. Mas sua solução também funciona se você precisar de certificados durante a construção do docker. Obrigado!
bastian
9
Eu teria medo de colocar certificados em qualquer recipiente público. Outra pessoa pode puxar seu contêiner e extrair seus certificados privados.
skibum55 01 de
4
Embora esse seja um ponto muito bom, a solução acima não torna nada público. Isso significa adicionar seus próprios certificados em uma imagem que é construída localmente e então usada de forma privada. Você poderia então enviar a imagem resultante para um repositório público, mas seria uma má ideia, como você disse.
shudgston
9
Desde quando os certificados são secretos?
techraf
3
Já que seu servidor precisa de uma chave privada para corresponder ao certificado que está publicando.
John Rix
21

Como foi sugerido em um comentário acima , se o armazenamento de certificados no host for compatível com o convidado, você pode simplesmente montá-lo diretamente.

Em um host Debian (e contêiner), fiz com sucesso:

docker run -v /etc/ssl/certs:/etc/ssl/certs:ro ...
Jonathon Reinhart
fonte
Então, o que fazer ao construir a imagem Docker no servidor de construção? : /
Ewoks de
@Ewoks Você pode hospedar seus certificados em algum DNS privado e carregá-los dentro de seus gráficos de comando e pode automatizar a criação do volume em seu cluster.
Bassam Gamal
0

Você pode usar o caminho relativo para montar o volume no contêiner:

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

Observe a marca de volta em pwdque fornece o diretório de trabalho atual. Ele assume que você tem a certspasta no diretório atual em que o docker runé executado. Ótimo para desenvolvimento local e manter a pasta certs visível para o seu projeto.

alltej
fonte