Fehlermeldung
Error response from daemon: Get "https://registry.example.com:5000/v2/": tls: failed to verify certificate: x509: certificate signed by unknown authority
Host und Port der Registry sind deine eigenen; docker push, pull und login melden es alle als „Error response from daemon: Get \"https://<registry>/v2/\": …“. containerd, nerdctl, Podman und Kubernetes-Knoten, die Images ziehen, geben denselben x509-Text mit ihrem eigenen Präfix aus.
Docker Engine (dockerd) — docker pull / push / login against a registry with an untrusted certificate
Was der Fehler bedeutet
Der Docker-Daemon (nicht die docker-CLI) hat versucht, die API der Registry unter /v2/ zu erreichen, und konnte ihr TLS-Zertifikat nicht prüfen: Die Kette führt zu keiner CA, der der Daemon vertraut. dockerd vertraut dem System-CA-Bundle des Hosts sowie CAs pro Registry, die unter /etc/docker/certs.d/<registry>:<port>/ abgelegt sind. Die üblichen Ursachen sind private Registrys mit Firmenzertifikaten und Proxys mit TLS-Inspektion.
Warum der Fehler auftritt
Eine selbst gehostete Registry mit privatem Zertifikat
häufigHarbor, GitLab-Registry, Nexus oder registry:2 hinter einem Zertifikat einer Firmen-CA oder einer selbst erstellten CA.
Ein Proxy mit TLS-Inspektion vor Docker Hub oder anderen Registrys
häufigDer Daemon sieht die Zertifikate des Proxys; ohne dessen Root-Zertifikat im Trust Store des Hosts scheitert jeder Pull.
Die CA wurde dort installiert, wo der Daemon nicht sucht
gelegentlichDie CA in den Trust Store des Client-Rechners zu kopieren, bringt nichts, wenn der Daemon woanders läuft (VM von Docker Desktop, entfernter DOCKER_HOST, CI-Runner). Der Verzeichnisname unter certs.d muss exakt mit Host und Port der Registry übereinstimmen.
Die Registry lässt ihr Zwischenzertifikat weg
gelegentlichGo (dockerd) lädt keine Zwischenzertifikate nach; eine Registry, die nur das Leaf-Zertifikat sendet, scheitert selbst mit einer öffentlichen CA.
So behebst du den Fehler
- 1.
CA für diese Registry in certs.d installieren
/etc/docker/certs.d/<host>:<port>/ca.crt wird bei jeder Anfrage gelesen; in der Reproduktion funktionierte docker login direkt nach dem Hinzufügen der Datei.
bash # Trust the registry's CA for this registry only (no daemon restart needed) sudo mkdir -p /etc/docker/certs.d/registry.example.com:5000 sudo cp corp-root-ca.pem /etc/docker/certs.d/registry.example.com:5000/ca.crt docker login registry.example.com:5000 - 2.
CA systemweit installieren und dockerd neu starten
Füge für Proxys und viele Registrys das Root-Zertifikat dem Bundle des Hosts hinzu; der Daemon liest es beim Start.
bash # Or system-wide (proxy roots, many registries), then restart the daemon sudo cp corp-root-ca.pem /usr/local/share/ca-certificates/corp-root-ca.crt sudo update-ca-certificates sudo systemctl restart docker - 3.
Docker Desktop: dem Root-Zertifikat auf dem Host vertrauen
Die VM von Docker Desktop übernimmt beim Start die vertrauenswürdigen Root-Zertifikate des Host-Betriebssystems; installiere das Root-Zertifikat also dort und starte Docker Desktop neu.
text Docker Desktop: the daemon runs in a VM. Add the root to the host's trust store (macOS Keychain "System" with "Always Trust", Windows "Trusted Root Certification Authorities") and restart Docker Desktop; it imports trusted host roots into the VM. - 4.
Kette der Registry prüfen
Wird nur das Leaf-Zertifikat gesendet, konfiguriere die Registry oder ihren Reverse Proxy mit der vollständigen Kette.
bash openssl s_client -connect registry.example.com:5000 -servername registry.example.com -showcerts </dev/null 2>/dev/null \ | grep -E '^ *[0-9]+ s:|^ *i:'
Verwandte Fehler
x509: certificate signed by unknown authorityGo crypto/x509tls: failed to verify certificate: x509: certificate signed by unknown authorityGo crypto/tls (Go ≥ 1.20)http: server gave HTTP response to HTTPS clientGo net/httpUnable to connect to the server: tls: failed to verify certificate: x509: certi…kubectl (client-go)