Contexte technique

Le package crypto/x509 de Go assure la validation des certificats TLS. Une issue récente (golang/go#82345) signale que la communauté a identifié des problèmes de sécurité liés à une autorité de certification (CA) dont les clés publiques sont jugées compromises. Pour répondre à ce risque, les développeurs de Go ont introduit une liste de huit Subject Public Key Info (SPKI) considérés comme non fiables. Un SPKI représente la clé publique d’un certificat sous forme d’un hachage (généralement SHA‑256). En ajoutant ces hachages à une liste de rejet, Go peut bloquer automatiquement toute chaîne de confiance qui les inclut, sans recourir à la révocation classique.

Mécanisme de rejet dans crypto/x509

Le code modifié introduit une table interne contenant les huit hachages SPKI. Lors de la vérification d’une chaîne, la fonction Verify compare chaque certificat intermédiaire à cette table. Si un hachage correspond, la validation échoue immédiatement avec l’erreur x509.UnknownAuthorityError. Le contrôle s’applique avant toute vérification de la date de validité ou de la correspondance du nom d’hôte, garantissant que les certificats compromis ne sont jamais acceptés.

var distrustSPKIs = map[string]bool{
    // huit hachages SHA‑256 des SPKI non fiables
    "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=": true,
    "sha256/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB=": true,
    // … six entrées supplémentaires …
}

func verifyChain(chain []*Certificate) error {
    for _, cert := range chain {
        if distrustSPKIs[cert.SubjectKeyId] {
            return errors.New("certificate chain contains a distrusted SPKI")
        }
    }
    // suite de la validation standard
    return nil
}

Cette implémentation repose uniquement sur le hachage du SPKI, ce qui évite les dépendances aux listes de révocation (CRL ou OCSP) souvent indisponibles ou lentes à mettre à jour.

Impacts sur les applications Go

Les programmes qui utilisent la validation TLS native de Go verront leurs connexions échouer dès qu’ils rencontreront un serveur présentant l’une des huit clés publiques. Cette mesure renforce la posture de sécurité en éliminant un vecteur d’attaque connu, mais elle introduit également un risque de rupture de service pour les environnements qui n’ont pas encore remplacé les certificats affectés. Les opérateurs doivent donc vérifier leurs certificats intermédiaires et, le cas échéant, les renouveler auprès d’une autorité de confiance.

Limites et perspectives

Le recours à une liste statique de SPKI ne couvre que les huit clés identifiées à ce jour. Si d’autres clés compromises sont découvertes, elles devront être ajoutées manuellement dans une future version de Go. De plus, la stratégie ne résout pas les problèmes de confiance liés aux certificats auto‑signés ou aux CA internes qui ne figurent pas dans la liste. Les équipes de sécurité doivent donc combiner cette protection avec des pratiques de gestion de certificats, comme la rotation régulière des clés et la surveillance des listes de révocation.