Fehlermeldung
remote error: tls: unknown certificate authority
Go-Server protokollieren „http: TLS handshake error from <client>: remote error: tls: unknown certificate authority“. In unseren Tests wurden Clients mit OpenSSL 3.5, die dasselbe Zertifikat über TLS 1.3 ablehnten, vom Server mit Go 1.27 stattdessen als „local error: tls: bad record MAC“ protokolliert, und Go-Clients senden bad_certificate (protokolliert als „remote error: tls: bad certificate“).
Go crypto/tls — TLS alert 48 (unknown_ca) received from the peer, e.g. an OpenSSL-based client rejecting a Go server's certificate
Was der Fehler bedeutet
Die Gegenstelle hat den TLS-Alert 48 (unknown_ca) gesendet: Das empfangene Zertifikat ließ sich nicht mit einer CA verketten, der sie vertraut. Im Log eines Go-Servers bedeutet das, dass ein Client (auf OpenSSL-Basis: curl, Python, Ruby, PHP, nginx als Proxy) das Zertifikat des Servers während eines Handshakes mit TLS 1.2 abgelehnt hat. In einem Go-Client bedeutet es, dass der Server bei Mutual TLS das Client-Zertifikat abgelehnt hat.
Warum der Fehler auftritt
Der Client vertraut der ausstellenden CA nicht
häufigPrivate oder firmeneigene CAs, die auf den Client-Rechnern oder in den Containern fehlen.
Der Go-Server sendet nur sein Leaf-Zertifikat
häufigListenAndServeTLS sendet genau die Zertifikate aus der Datei; enthält die Datei nur das Leaf-Zertifikat, können Clients kein Root-Zertifikat erreichen.
Mutual TLS: Der Server vertraut der CA des Clients nicht
gelegentlichAuf der Client-Seite bedeutet dieser Alert, dass die ClientCAs des Servers den Aussteller des Client-Zertifikats nicht enthalten.
So behebst du den Fehler
- 1.
Ausgelieferte Kette von einem Client aus prüfen
Wird nur das Leaf-Zertifikat gesendet, korrigiere die Datei; endet die Kette bei einem privaten Root-Zertifikat, installiere dieses Root-Zertifikat auf den Clients.
bash openssl s_client -connect api.example.com:443 -servername api.example.com -showcerts </dev/null 2>/dev/null \ | grep -E '^ *[0-9]+ s:|^ *i:|Verify return code' - 2.
Vollständige Kette aus Go ausliefern
Schreibe das Leaf-Zertifikat und seine Zwischenzertifikate in die PEM-Datei, die du an ListenAndServeTLS (oder tls.LoadX509KeyPair) übergibst.
go // Leaf + intermediates in one file; Go sends every certificate in it srv := &http.Server{Addr: ":443"} log.Fatal(srv.ListenAndServeTLS("fullchain.pem", "server.key")) - 3.
Privates Root-Zertifikat auf den Clients installieren
Verteile bei internen Diensten das Root-Zertifikat der Firma an die Systeme und Container, die den Server aufrufen.
bash # Private CA: install the root on the clients (Debian/Ubuntu example) sudo cp corp-root-ca.pem /usr/local/share/ca-certificates/corp-root-ca.crt && sudo update-ca-certificates