Aller au contenu
ecdsa.com
Go crypto/tlsGo

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

Comment corriger l’erreur

  1. 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. 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. 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

Erreurs associées

Parcourir toute la base de données des erreurs de signature