Fehlermeldung
http: server gave HTTP response to HTTPS client
Programme stellen ihr eigenes Präfix voran: Docker gibt „Error response from daemon: Get \"https://<registry>/v2/\": http: server gave HTTP response to HTTPS client“ aus, Go-Programme „Get \"https://…\": http: server gave …“. Ist die Antwort auch kein HTTP, meldet Go „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)
Was der Fehler bedeutet
Der HTTP-Client von Go hat einen TLS-Handshake begonnen, und der Server hat eine HTTP-Antwort im Klartext zurückgeschickt; Go erkennt die Bytes „HTTP/“ und meldet, dass der Server HTTP spricht, nicht HTTPS. Der bekannteste Fall ist docker pull oder docker login gegen eine selbst gehostete Registry ohne TLS: Docker verlangt HTTPS für jede Registry, die weder auf einer Loopback-Adresse läuft noch ausdrücklich als unsicher markiert ist.
Warum der Fehler auftritt
Eine Container-Registry ohne TLS
häufigregistry:2 (distribution), Harbor oder Nexus wurden zum Testen mit einfachem HTTP gestartet. Docker, containerd, Podman, Helm und Skopeo erwarten HTTPS für alles, was nicht localhost ist.
https:// mit dem HTTP-Port
häufigEine URL oder Konfiguration, die https:// mit Port 80, 8080 oder einem internen Dienstport kombiniert.
TLS wird von einem Proxy auf einem anderen Port terminiert
gelegentlichDas Backend spricht hinter einem Load Balancer HTTP; Clients, die den Load Balancer umgehen und den Port des Backends mit https:// ansprechen, erhalten diesen Fehler.
So behebst du den Fehler
- 1.
Bestätigen, dass der Port einfaches HTTP spricht
Eine HTTP-Statuszeile über http:// bestätigt es. Verwende den TLS-Endpunkt (oder http://, wo das vertretbar ist).
bash curl -si http://registry.example.com:5000/v2/ | head -1 # answers over plain HTTP? - 2.
Registry über TLS betreiben
Gib der Registry ein Zertifikat (öffentlich per ACME oder von der Firmen-CA) und konfiguriere es, oder schalte einen Proxy davor, der TLS terminiert.
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.
Letzter Ausweg: Registry als unsicher markieren (daemon.json)
Trägst du sie unter insecure-registries in /etc/docker/daemon.json ein (und startest dockerd neu), spricht Docker einfaches HTTP mit ihr. Images und Zugangsdaten werden dann unverschlüsselt und ohne Authentifizierung übertragen; nutze das nur in isolierten Labornetzen.
json { "insecure-registries": ["registry.example.com:5000"] }