Message d’erreur
ssh: this private key is passphrase protected
Également affiché sous la forme
- ssh: no key found
Le message « ssh: no key found » (répertorié comme alias) correspond à une autre situation détectée par le même analyseur : les octets ne contiennent aucun bloc de clé PEM, par exemple dans le cas d’une clé publique, d’un fichier PuTTY `.ppk` ou d’un fichier vide.
golang.org/x/crypto/ssh (Go) — *ssh.PassphraseMissingError from ssh.ParsePrivateKey
Ce que cela signifie
`ssh.ParsePrivateKey` a reconnu une clé privée chiffrée et s’est arrêté, faute de phrase de passe pour la déchiffrer. Le `*ssh.PassphraseMissingError` renvoyé contient même la clé publique, mais la signature exige la clé privée déchiffrée : appelez `ssh.ParsePrivateKeyWithPassphrase` ou laissez un agent SSH signer à votre place. L’erreur voisine « ssh: no key found » signifie que l’entrée ne contient aucune clé reconnaissable.
Pourquoi cela se produit
La clé a été créée avec une phrase de passe
fréquente`ssh-keygen` demande une phrase de passe et chiffre le fichier de clé avec celle-ci. En mode interactif, OpenSSH la demande ou passe par l’agent ; un programme Go doit la fournir explicitement.
L’outil comptait sur l’agent pour déverrouiller la clé
occasionnelleSur un poste de travail, `ssh-add` conserve la clé déchiffrée et `ssh` ne lit jamais le fichier. Le code Go qui lit directement le fichier ne profite pas de l’agent.
Une clé personnelle chiffrée copiée dans la CI
occasionnelleLes clés de déploiement destinées à l’automatisation sont généralement non chiffrées et dotées de droits strictement limités ; réutiliser une clé personnelle chiffrée dans la CI échoue ici.
Comment corriger l’erreur
- 1.
Détecter l’erreur et fournir la phrase de passe
`errors.As` permet de repérer l’absence de phrase de passe ; lisez celle-ci depuis un gestionnaire de secrets, jamais depuis le code source.
go signer, err := ssh.ParsePrivateKey(keyBytes) var missing *ssh.PassphraseMissingError if errors.As(err, &missing) { passphrase := []byte(os.Getenv("SSH_KEY_PASSPHRASE")) signer, err = ssh.ParsePrivateKeyWithPassphrase(keyBytes, passphrase) } if err != nil { return err } - 2.
Signer via l’agent SSH
Avec `golang.org/x/crypto/ssh/agent`, la clé privée n’entre jamais dans votre processus et c’est l’agent qui gère la phrase de passe.
go import "golang.org/x/crypto/ssh/agent" conn, err := net.Dial("unix", os.Getenv("SSH_AUTH_SOCK")) if err != nil { return err } agentClient := agent.NewClient(conn) auth := ssh.PublicKeysCallback(agentClient.Signers) // the agent holds the decrypted key