Message d’erreur
http: server gave HTTP response to HTTPS client
Les programmes ajoutent leur propre préfixe : Docker affiche « Error response from daemon: Get \"https://<registry>/v2/\": http: server gave HTTP response to HTTPS client », les programmes Go « Get \"https://…\": http: server gave … ». Lorsque la réponse n’est pas non plus du HTTP, Go indique « tls: first record does not look like a TLS handshake ».
Go net/http — the TLS handshake received a plain HTTP response (also printed by Docker, Helm, Terraform)
Ce que cela signifie
Le client HTTP de Go a lancé un handshake TLS, et le serveur a renvoyé une réponse HTTP en texte clair ; Go reconnaît les octets « HTTP/ » et signale que le serveur parle HTTP, pas HTTPS. Le cas le plus connu est docker pull ou docker login vers un registre auto-hébergé qui fonctionne sans TLS : Docker exige HTTPS pour tout registre qui n’est pas sur une adresse de bouclage ou explicitement marqué comme non sécurisé.
Pourquoi cela se produit
Un registre de conteneurs sans TLS
fréquenteUn registre registry:2 (distribution), Harbor ou Nexus démarré en HTTP simple pour des tests. Docker, containerd, Podman, Helm et Skopeo attendent HTTPS pour tout ce qui n’est pas localhost.
https:// avec le port HTTP
fréquenteUne URL ou une configuration qui associe https:// au port 80, 8080 ou au port d’un service interne.
La terminaison TLS se fait sur un proxy, sur un autre port
occasionnelleLe backend parle HTTP derrière un répartiteur de charge ; les clients qui contournent le répartiteur et atteignent le port du backend avec https:// obtiennent cette erreur.
Comment corriger l’erreur
- 1.
Confirmer que le port parle HTTP en clair
Une ligne de statut HTTP obtenue via http:// le confirme. Utilisez le point de terminaison TLS (ou http:// là où c’est acceptable).
bash curl -si http://registry.example.com:5000/v2/ | head -1 # answers over plain HTTP? - 2.
Servir le registre en TLS
Dotez le registre d’un certificat (ACME public ou AC d’entreprise) et configurez-le, ou placez devant lui un proxy qui assure la terminaison TLS.
yaml # Docker registry (distribution) config.yml: serve TLS http: addr: :5000 tls: certificate: /certs/registry.example.com.fullchain.pem key: /certs/registry.example.com.key - 3.
En dernier recours : marquer le registre comme non sécurisé (daemon.json)
L’ajouter à insecure-registries dans /etc/docker/daemon.json (puis redémarrer dockerd) permet à Docker de lui parler en HTTP simple. Les images et les identifiants circulent alors sans chiffrement ni authentification ; ne le faites que sur des réseaux de laboratoire isolés.
json { "insecure-registries": ["registry.example.com:5000"] }