web-dev-qa-db-fra.com

Comment réparer le certificat client expiré dans Docker-Machine

Faire un docker-machine ls a obtenu l'inattendu Unable to query docker version: Get https://x.x.x.x:2376/v1.15/version: x509: certificate has expired or is not yet valid pour chaque machine.

Je n'avais rien fait récemment. En regardant SO, j'ai essayé quelques coupables courants, VPN, virus, problèmes d'horloge étranges, etc. Rien de tout cela ne s'appliquait. Comment puis-je les réparer pour les rendre à nouveau utilisables (via le docker-machine interface)?

Utilisation de Docker pour Mac, 17.12.0-ce-49

13
rubyisbeautiful

pdate - comme je l'ai commenté le 14/02/2018, cela fait maintenant partie de docker-machine.
Essayez: docker-machine regenerate-certs --client-certs

Réponse historique ci-dessous:


Première, docker-machine regenerate-certs ne régénère PAS le ou les certificats client.

Après avoir fouillé avec openssl, j'ai découvert que c'était en fait le certificat client qui avait expiré. Vérifier:

openssl x509 -in ~/.docker/machine/certs/cert.pem -text | grep "Not After"

J'ai essayé de recréer les certificats in situ avec le même ca.pem mais ça n'a pas marché (pour moi). Je suppose que cela aurait finalement fonctionné, étant donné beaucoup plus de temps et d'essais et d'erreurs.

Ce qui a finalement fonctionné était de sauvegarder le répertoire entier, de créer une machine jetable factice (pour forcer la machine à docker à créer de nouveaux certificats), de déplacer les configurations, les clés ssh et les certificats de serveur (pas certificats client), puis émission d'une régénération pour chaque machine. NB, c'est perturbant et douloureux. Comme l'avertissement le montre, docker-machine regenerate-certs redémarrera docker sur la machine cible. Bien qu'il soit trop tard pour moi, j'aimerais voir une meilleure réponse.

Le processus ressemble à:

#!/bin/bash

cd ~/.docker || exit
cp -R machine machine.bak
rm -rf machine
docker-machine create deleteme
docker-machine rm -rf deleteme
cd machine/machines || exit

for m in $(~/.docker/machine.bak/machines)
do
    cp -R "../../machine.bak/machines/$m" .
    rm "$m/cert.pem"
    rm "$m/key.pem"
    cp certs/cert.pem "$m"
    cp certs/key.pem "$m"
    docker-machine regenerate-certs -f
done
18
rubyisbeautiful

Essayer:

docker-machine regenerate-certs --client-certs <machine name>

Le --client-certs est important.

Remarque:

La validité peut être vérifiée en exécutant:

openssl x509 -in ~/.docker/machine/certs/cert.pem -text -noout | less

Le résultat est quelque chose comme:

 Certificate:
     Data:
     ...
     Signature Algorithm: sha256WithRSAEncryption
         ...
         Validity
             Not Before: Mar 12 09:03:00 2018 GMT
             Not After : Feb 24 09:03:00 2021 GMT
     ...
9
skytteren