Machine: Forma recomendada de instalar o certificado CA na máquina docker VM local

Criado em 3 set. 2015  ·  34Comentários  ·  Fonte: docker/machine

Normalmente, o certificado de CA raiz da empresa é instalado pelo TI nas máquinas e servidores dos desenvolvedores (eles não vêm com o sistema operacional). Ao usar a máquina docker com VMs locais (virtualbox), precisamos instalar o certificado CA raiz da empresa na VM para falar com um registro docker hospedado na rede da empresa?

Estou me perguntando qual é a maneira recomendada para instalar o certificado CA em minha VM local? Parece ser um começo de resposta aqui, mas nada convincente / adequado.

E se houver CAs de empresas intermediárias, qual é a forma recomendada? Empacotar todos os certs?

areidentity

Comentários muito úteis

Isso exigiu muito trabalho e a solução é embaraçosamente simples (mas não óbvia). E há algumas coisas a serem observadas. A resposta estava aqui - mas você tem que ler além da seção de código para a abordagem alternativa.

Basicamente, copie as versões pem (codificadas em Base64) de sua cadeia de confiança de CA em /var/lib/boot2docker/certs/ . Você não pode usar pacotes CA. O script de inicialização boot2docker selecionará automaticamente os arquivos pem e os adicionará à configuração ssl. Além disso, este é um diretório especial e será preservado durante as reinicializações.

$ docker-machine ssh default 'sudo mkdir /var/lib/boot2docker/certs'
$ docker-machine scp corp-ca.pem default:
$ docker-machine ssh default 'sudo mv corp-ca.pem /var/lib/boot2docker/certs/'
$ docker-machine restart default 

Isso deve ser mais simples, então eu apoio (# 1799). Além disso, devemos ser capazes de especificar um diretório cheio de arquivos pem, portanto, adicionar vários certificados (como em cadeias de confiança inteiras) é fácil.

Todos 34 comentários

Eu também gostaria de saber isso. Segui o procedimento (https://docs.docker.com/articles/https/) para criar uma nova CA e certificados. Tentei colocar os arquivos / var / lib / boot2docker e / var / lib / boot2docker / tls, mas estou tendo problemas com o script de inicialização /etc/init.d/docker sobrescrevendo o certificado que gerei.

Eu examinei isso um pouco mais e parece que docker-machine irá sobrescrever qualquer coisa no host .docker / machines / machine / default com os certificados que ele gera. Ele também substitui arquivos no boot2docker vm em / var / lib / boot2docker. É possível fazer o login e substituir arquivos no vm e atualizar / var / lib / boot2docker / profile, mas isso também é substituído na inicialização (não tenho certeza por quê, mas possivelmente por 'docker-machine env default').

@oobles você deve ser capaz de usar as opções --tls-ca-cert , --tls-cert e --tls-key para especificar os certificados existentes.

Ao usar docker-machine --tls-ca-cert=my_company_ca.pem create --driver virtualbox vm , o comando falha em:

Error creating machine: error generating server cert: crypto/tls: private key does not match public key

O ponto aqui (e eu acho que na maioria das empresas) é que não posso dar a opção --tls-ca-key porque não gerencio a CA da empresa, então não conheço a chave privada.

O que estou perdendo aqui ? Essas opções são úteis apenas para pessoas que gerenciam sua própria CA, assinando seus próprios certificados?

Só quero que meu cliente docker (em minha VM) seja docker login no registro de nossa empresa, que mostra um certificado assinado pela CA da empresa.

Qualquer ajuda ?

Mesmo problema aqui alguma melhoria?

+1. O mesmo problema em nossa organização.

A maneira como resolvi a situação foi:
No servidor de registro:

  1. crie os certificados autoassinados conforme o estado na documentação do docker.
  2. criar um arquivo .pem concatenando a chave e o arquivo cert

Na máquina Docker:

  1. copie via scp o arquivo pem para [email protected] : / home / docker
  2. via ssh [email protected] (senha: tcuser) mova o arquivo pem para: / var / lib / boot2docker / certs /
  3. Reinicie a máquina Docker

Minhas compilações de contêineres atingiram unable to find valid certification ao baixar da conexão https. Minha empresa usa um certificado raiz ZScaler CA intermediário e também usa um arquivo PAC para configurar automaticamente o proxy.

+1 sobre isso. Se fosse possível reutilizar os certificados existentes de CA (certificado e chave) e de cliente (certificado e chave), realmente deveria ser possível reutilizar a infraestrutura TLS existente ao implantar certificados para docker engine com docker-machine, por exemplo,

  • --tls-server-cert
  • --tls-server-key
docker-machine create -d ... \
  --tls-ca-cert cacert.pem \
  --tls-ca-key cacert.key \
  --tls-client-cert local_user.pem \
  --tls-client-key local_user.key \
  --tls-server-cert server.pem \
  --tls-server-key server.key

Error creating machine: Error running provisioning: error generating server cert: crypto/tls: failed to parse private key entra em ação porque cacert.key é protegido por senha.

+1

👍, pois este é um grande bloqueador para nós. Nossa organização de TI corporativa coloca um certificado HTTPS personalizado em todas as solicitações de dentro de nosso firewall corporativo para a Internet pública, portanto, não podemos nem mesmo entrar em contato com o hub do docker para obter contêineres sem sermos capazes de configurar esses certificados corretamente.

Alguém já encontrou uma solução para isso? Nossa empresa de TI faz um MitM para substituir todos os certificados HTTPS.

Quando eu tentei ...
docker-machine --tls-ca-cert root.cer create --driver virtualbox default lança o seguinte erro

Error creating machine: Error running provisioning: error generating server cert: crypto/tls: private key does not match public key

Acabei pulando o certificado tls no momento da criação da máquina. Depois de criar
a máquina:

docker-machine scp certfile padrão: ca.crt
docker-machine ssh padrão
sudo mv ~ / ca.crt /etc/docker/certs.d/docker.io/ca.crt

Então deve funcionar. Você pode ter que mkdir os subdiretórios antes do mv
comando. Substitua docker.io por um host de registro interno, se necessário.

Na quinta-feira, 11 de agosto de 2016, Andy Ruestow [email protected] escreveu:

Alguém já encontrou uma solução para isso? Nossa empresa de TI faz um MitM para
substituir todos os certificados HTTPS.

Quando eu tentei ...
docker-machine --tls-ca-cert root.cer create --driver virtualbox default
lança o seguinte erro

Erro ao criar máquina: Erro ao executar provisionamento: geração de erro
certificado do servidor: crypto / tls: a chave privada não corresponde à chave pública

-
Você está recebendo isto porque comentou.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/docker/machine/issues/1799#issuecomment -239175647,
ou silenciar o tópico
https://github.com/notifications/unsubscribe-auth/AAJD9p1tfX97V_OW4DgJkzxP86URi-C5ks5qezAsgaJpZM4F3GTM
.

+ 1 GE está usando Zscaler e fazendo MitM cert muting e docker é inutilizável de todas as nossas máquinas de desenvolvedor agora.

1, tentando resolver isso agora também.

+1, também tentando resolver isso em um ambiente corporativo

+1 também ambiente corporativo, proxy faz MitM cert mut mangling. Precisa de uma maneira de instalar certs.

Isso exigiu muito trabalho e a solução é embaraçosamente simples (mas não óbvia). E há algumas coisas a serem observadas. A resposta estava aqui - mas você tem que ler além da seção de código para a abordagem alternativa.

Basicamente, copie as versões pem (codificadas em Base64) de sua cadeia de confiança de CA em /var/lib/boot2docker/certs/ . Você não pode usar pacotes CA. O script de inicialização boot2docker selecionará automaticamente os arquivos pem e os adicionará à configuração ssl. Além disso, este é um diretório especial e será preservado durante as reinicializações.

$ docker-machine ssh default 'sudo mkdir /var/lib/boot2docker/certs'
$ docker-machine scp corp-ca.pem default:
$ docker-machine ssh default 'sudo mv corp-ca.pem /var/lib/boot2docker/certs/'
$ docker-machine restart default 

Isso deve ser mais simples, então eu apoio (# 1799). Além disso, devemos ser capazes de especificar um diretório cheio de arquivos pem, portanto, adicionar vários certificados (como em cadeias de confiança inteiras) é fácil.

@rpomeroy muito obrigado, eu estava fazendo tudo igual, mas não sabia que era necessário reiniciar a VM e por isso estava copiando o certificado de todos os lugares para fazê-lo funcionar

Qualquer correção para Docker para Windows

@rpomeroy Obrigado, importar a empresa root ca em nossa máquina docker é suficiente para tornar nosso registro acessível? Ou também precisamos colocar coisas em /etc/docker/certs.d/hostname/

Como mencionado anteriormente no tópico, a distro Linux abaixo do boot2docker é basicamente imutável, então colocar coisas em / etc / docker / certs não sobreviverá. Apenas o var / lib / boot2docker / certs é mutável e persistente. Observe que todas essas informações podem precisar ser verificadas novamente com versões mais recentes do boot2docker.

Estou executando o Windows 7 + VirtualBox (v5.2.6) + Docker Toolbox (Boot2Docker versão 18.02.-ce) e tive o mesmo problema.
Por exemplo, ao tentar executar um contêiner, recebo o seguinte erro:
docker executa ubuntu / bin / echo 'Olá, mundo'
Não foi possível encontrar a imagem ' ubuntu: mais recente ' localmente
C: \ Arquivos de programas \ Docker Toolboxdocker.exe: Resposta de erro do daemon: Obtenha https://registry-1.docker.io/v2/ : x509: certificado assinado por autoridade desconhecida.
Consulte 'C: \ Arquivos de programas \ Docker Toolboxdocker.exe run --help'.

A seguinte solução funcionou para mim:

  1. Faça login no docker VM padrão
  2. Baixe os certificados raiz da sua empresa
  3. Crie um novo diretório:
    sudo mkdir / var / lib / boot2docker / certs
  4. Copie os certificados raiz da sua empresa para a pasta recém-criada:
    sudo cp Root-Ca1.crt Root-Ca2.crt / var / lib / boot2docker / certs
  5. Reinicializar VM padrão
    Agora ele está puxando a imagem :)

@kvvoronina estou enfrentando o mesmo problema com você. em vez disso, estou executando o docker toolbox no win 8.1
estou tentando usar seus passos. mas estou usando conexão direta (significa que não posso fornecer nenhum certificado raiz da empresa nas etapas 2 e 4). como resolver isso? obrigado

Olá,

obrigado fantasma é trabalho e eu posso puxar minha imagem agora.
Mas não consigo construir a imagem deste exemplo: https://docs.docker.com/get-started/part2/#build -the-app
iget este erro:
Step 4/7 : RUN pip install --trusted-host pypi.python.org -r requirements.txt ---> Running in b700eb53b7b2 Collecting Flask (from -r requirements.txt (line 1)) Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAI LED] certificate verify failed (_ssl.c:726)'),)': /simple/flask/
Você tem um problema para isso?

Ubel, estou tendo o mesmo problema, preciso extrair imagens, mas não consigo construir imagens usando o guia de início de sessão de encaixe. Você conseguiu superar o problema?

@cmenjivar : Não, ainda tenho o mesmo problema ...

@Ubel : Eu encontrei uma solução, em seu Dockerfile, basta adicionar todos os 3 hosts Python hospedados, em vez de apenas um ...

RUN pip install --trusted-host pypi.python.org --trusted-host files.pythonhosted.org --trusted-host pypi.org -r requirements.txt

@cmenjivar : obrigado pela sua ajuda. está funcionando para mim também.

Agora eu preciso tentar as mesmas coisas com o url do pacote nuget

Alguém poderia atualizar isso para o host do Windows e o contêiner do Windows?

Por que vale a pena, @rpomeroy tem a resposta correta ...

Emita os seguintes comandos no "Terminal Docker Quickstart" se estiver no Windows, para garantir que você tenha o ambiente apropriado. O "$" é o prompt, não cole essa parte. Você pode querer emitir um cd ~/Downloads para chegar à sua pasta Downloads antes de executar os comandos abaixo. Você pode repetir as duas etapas intermediárias (corp-ca.pem) para cada Autoridade de Certificação que você precisa adicionar (intermediário ou não), apenas dê a eles um nome diferente. Você também pode usar um curinga, por exemplo: corp-*.pem se você tivesse corp-ca-root.pem, corp-ca-intermediário.pem e corp-issuing-ca.pem.

copiado de @rpomeroy acima:

$ docker-machine ssh default 'sudo mkdir /var/lib/boot2docker/certs'
$ docker-machine scp corp-ca.pem default:
$ docker-machine ssh default 'sudo mv corp-ca.pem /var/lib/boot2docker/certs/'
$ docker-machine restart default 

Pessoas que estão tentando usar --tls-cert, --tls-key e --tls-ca-cert estão usando opções incorretas. Esses são para autenticação entre o cliente docker e o servidor.

O único ponto que eu gostaria de salientar é que os sistemas de arquivos em / etc não são realmente "imutáveis", eles são na verdade "efêmeros" (tmpfs), o que significa que eles desaparecerão a cada reinicialização. As informações em / var / lib / boot2docker / certs serão preenchidas novamente no local correto em / etc / docker / certs ...

De qualquer forma, seria bom se a docker-machine confiasse automaticamente em qualquer certificado em que o sistema host confie.

Para aqueles que deixaram esta solução pensando que só funcionaria para a configuração do boot2docker e não para a configuração do Docker para Windows (Hyper-V), esta (solução de @rpomeroy ) também parece funcionar perfeitamente. Devo ter lido este tópico meia dúzia de vezes e descartado porque não era específico para o ambiente do Docker para Windows.

@rpomeroy 's solução funciona tanto para boot2docker e Docker para Windows.

Eu carreguei os certificados .cer da minha empresa dentro do diretório / etc / pki / ca-trust / source / anchors do meu contêiner do docker e digitei os comandos abaixo.

update-ca-trust enable
update-ca-trust

Depois de fazer as etapas acima, eu poderia obter a saída necessária do curl

Apenas entrando na conversa ..

Parece que adicionar essas duas montagens em seu contêiner parece funcionar com a maioria das configurações:

    volumes:
      - /etc/ssl/certs:/etc/ssl/certs
      - /usr/share/ca-certificates:/usr/share/ca-certificates

O Windows é outra história ... Eu evitaria usar um host Windows Docker, se possível.

Esta página foi útil?
0 / 5 - 0 avaliações