Message d’erreur
remote error: tls: unknown certificate authority
Les serveurs Go consignent « http: TLS handshake error from <client>: remote error: tls: unknown certificate authority ». Lors de nos tests, des clients OpenSSL 3.5 qui rejetaient le même certificat en TLS 1.3 ont plutôt été consignés par le serveur Go 1.27 sous la forme « local error: tls: bad record MAC », et les clients Go envoient bad_certificate (consigné sous la forme « 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
Ce que cela signifie
Le pair a envoyé l’alerte TLS 48 (unknown_ca) : il n’a pas pu rattacher le certificat reçu à une AC à laquelle il fait confiance. Dans le journal d’un serveur Go, elle signifie qu’un client (fondé sur OpenSSL : curl, Python, Ruby, PHP, nginx en tant que proxy) a rejeté le certificat du serveur pendant un handshake TLS 1.2. Côté client Go, elle signifie que le serveur a rejeté le certificat client en TLS mutuel.
Pourquoi cela se produit
Le client ne fait pas confiance à l’AC émettrice
fréquenteAC privées ou d’entreprise absentes des machines ou des conteneurs clients.
Le serveur Go n’envoie que son certificat feuille
fréquenteListenAndServeTLS envoie exactement les certificats présents dans le fichier ; avec un fichier qui ne contient que le certificat feuille, les clients ne peuvent pas remonter jusqu’à une racine.
TLS mutuel : le serveur ne fait pas confiance à l’AC du client
occasionnelleCôté client, cette alerte signifie que les ClientCAs du serveur n’incluent pas l’émetteur du certificat client.
Comment corriger l’erreur
- 1.
Vérifier la chaîne servie depuis un client
Si seul le certificat feuille est envoyé, corrigez le fichier ; si la chaîne se termine par une racine privée, installez cette racine sur les 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.
Servir la chaîne complète depuis Go
Placez le certificat feuille et ses certificats intermédiaires dans le fichier PEM passé à ListenAndServeTLS (ou à tls.LoadX509KeyPair).
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.
Installer la racine privée sur les clients
Pour les services internes, déployez la racine de l’entreprise sur les systèmes et les conteneurs qui appellent le serveur.
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