Zum Inhalt springen
ecdsa.com
Go net/httpGo

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

So behebst du den Fehler

  1. 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. 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. 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"]
    }

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen