web-dev-qa-db-fra.com

certificat "docker pull" signé par une autorité inconnue

J'essayais de tirer une image Docker d'un registre Docker mais j'ai rencontré le problème suivant:

$ docker pull <docker registry>/<image name>/<tag> 
Error response from daemon: Get <docker registry>/v1/_ping: x509: certificate signed by unknown authority

J'ai essayé avec "curl" et j'obtiens un message d'erreur similaire:

 curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.

J'ai donc téléchargé le certificat CA et importé sur le serveur (RedHat Linux 7) avec les commandes suivantes:

cp root_cert.cer /etc/pki/ca-trust/source/anchors/
update-ca-trust

Une fois le certificat racine importé, je peux voir que curl fonctionne correctement car il ne se plaindra pas de l'erreur de certificat, mais si j'utilise docker pull J'ai toujours le même problème. docker utilise-t-il un emplacement ca-cert différent de curl? Comment résoudre le problème avec docker pull dans cette situation?

16
Chen Xie

Vous devrez peut-être redémarrer le service Docker pour qu'il détecte la modification des certificats du système d'exploitation.

Docker dispose d'un emplacement supplémentaire que vous pouvez utiliser pour approuver la CA du serveur de registre individuel. Vous pouvez placer le certificat CA à l'intérieur de /etc/docker/certs.d/<docker registry>/ca.crt. Incluez le numéro de port si vous le spécifiez dans la balise d'image, par exemple.

/etc/docker/certs.d/my-registry.example.com:5000/ca.crt
16
BMitch
  • créez d'abord un fichier - /etc/docker/daemon.json
  • que d'exécuter ce qui suit pour ajouter des certificats

    openssl s_client -showcerts -connect <registry_address>:<registry_port> < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /etc/docker/certs.d/<registry_address>/ca.crt
    

fonctionne sans redémarrage

OU

importer le certificat dans un système comme

  • enregistrer le certificat dans le fichier, comme la commande ci-dessus (le port est crucial, pas besoin de protocole)

    openssl s_client -showcerts -connect <registry_address>:<registry_port> < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ca.crt
    
  • copiez-le dans/usr/local/share/certificats-ca /

    cp ca.crt /usr/local/share/ca-certificates/
    
  • exécuter les certificats update-ca

    Sudo update-ca-certificates
    
  • redémarrez docker!
10
matson kepson

Voici une solution rapide:

  • Modifiez ou créez le fichier /etc/docker/daemon.json et ajoutez des registres non sécurisés:

exemple pour docker.squadwars.org:

        {
“insecure-registries” : [“docker.squadwars.org:443”]
}
  • Redémarrez le démon docker

    systemctl restart docker

  • Créez un répertoire avec le même nom de l'hôte.

exemple pour docker.squadwars.org:

mkdir -p /etc/docker/certs.d/docker.squadwars.org
  • Obtenez le certificat et enregistrez-le dans le répertoire créé.

    ex + '/ BEGIN CERTIFICATE /,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect docker.squadwars.org:443) -scq> /etc/docker/certs.d/docker.squadwars.org/ docker_registry.crt

2
William Santos