Zum Inhalt springen
ecdsa.com
golang.org/x/crypto/ssh (Go)Go

Fehlermeldung

ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain

Auch ausgegeben als

  • ssh: unable to authenticate, attempted methods [none], no supported methods remain

Die Liste in eckigen Klammern spiegelt die Methoden in `Auth` wider, die du konfiguriert hast. `[none]` allein bedeutet, dass der Client überhaupt keine nutzbare Methode hatte – typischerweise ein leerer Slice `Auth` oder ein Schlüssel, der sich nicht laden ließ.

golang.org/x/crypto/ssh (Go) — ssh.Dial / ssh.NewClientConn

Was der Fehler bedeutet

Der SSH-Transport wurde aufgebaut (Host-Schlüssel akzeptiert), aber jede Authentifizierungsmethode, die der Client versucht hat, wurde abgelehnt, und der Server hat nichts weiter angeboten, was der Client tun könnte. Die Liste in eckigen Klammern zeigt, was der Go-Client versucht hat: `none` ist die erste Probeanfrage, die jeder SSH-Client sendet, `publickey` bedeutet, dass deine Schlüssel angeboten und abgelehnt wurden. Das ist das Go-Gegenstück zu „Permission denied (publickey)“ von OpenSSH.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    Schlüssel explizit laden und Host prüfen

    Lies den privaten Schlüssel ein, brich mit einem deutlichen Fehler ab, wenn das Parsen fehlschlägt, und verwende für den Host-Schlüssel `knownhosts` statt `ssh.InsecureIgnoreHostKey()`.

    go
    keyBytes, err := os.ReadFile(os.ExpandEnv("$HOME/.ssh/id_ed25519"))
    if err != nil {
    	return err
    }
    signer, err := ssh.ParsePrivateKey(keyBytes)
    if err != nil {
    	return err
    }
    hostKeys, err := knownhosts.New(os.ExpandEnv("$HOME/.ssh/known_hosts"))
    if err != nil {
    	return err
    }
    client, err := ssh.Dial("tcp", "server.example.com:22", &ssh.ClientConfig{
    	User:            "deploy",
    	Auth:            []ssh.AuthMethod{ssh.PublicKeys(signer)},
    	HostKeyCallback: hostKeys,
    })
  2. 2.

    Fingerabdrücke vergleichen und Server-Log lesen

    sshd protokolliert, warum es einen Schlüssel abgelehnt hat (falsche Berechtigungen für `~/.ssh`, nicht akzeptierter Algorithmus, unbekannter Benutzer). Die Client-Seite erfährt den Grund nie.

    bash
    ssh-keygen -lf ~/.ssh/id_ed25519.pub                 # fingerprint of the key the program uses
    ssh deploy@server.example.com 'ssh-keygen -lf ~/.ssh/authorized_keys'
    sudo journalctl -u ssh -n 20                         # sshd's reason (modes, algorithms, user)

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen