Der private Schlüssel und der öffentliche Schlüssel im selben Verzeichnis führen dazu, dass ssh fehlschlägt

7

Ich habe dieses wirklich seltsame Problem, bei dem ich versuche, über SSH eine Verbindung zu einem Remote-Server herzustellen.

Ich mache das über die Kommandozeile und sowohl der private als auch der öffentliche Schlüssel befinden sich in meinem aktuellen Verzeichnis. Sie heißen id_rsa bzw. id_rsa.pub. Ich habe über den Fingerabdruck überprüft, ob sie mit öffentlichen und privaten Schlüsseln übereinstimmen.

Wenn ich den folgenden Befehl gebe:

ssh -vT -i ./id_rsa user @ remotehost

Ich erhalte die folgende Fehlermeldung: Berechtigung verweigert (publickey).

Wenn ich jedoch meine id_rsa.pub in etwas anderes umbenenne, funktioniert es einwandfrei. Was könnte dies möglicherweise verursachen? Könnte es eine Einstellung auf dem Remote-Server sein, die dies verursacht?

Die Ausgabe von -vT, wenn sich die Datei id_rsa.pub im selben Verzeichnis befindet, lautet (und schlägt fehl):

OpenSSH_6.1p1, OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 50: Applying options for *
debug1: Connecting to remotehost port 22.
debug1: Connection established.
debug1: identity file ./id_rsa type 1
debug1: identity file ./id_rsa-cert type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.3p1 Debian-3ubuntu7
debug1: match: OpenSSH_5.3p1 Debian-3ubuntu7 pat OpenSSH_5*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.1
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Server host key: RSA <removed>
debug1: Host remotehost is known and matches the RSA host key.
debug1: Found key in /home/user/.ssh/known_hosts:10
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
Ubuntu 10.04.4 LTS
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering RSA public key: ./id_rsa
debug1: Authentications that can continue: publickey
debug1: No more authentication methods to try.
Permission denied (publickey).

Die Debug-Ausgabe beim Umbenennen der Datei id_rsa.pub lautet:

OpenSSH_6.1p1, OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 50: Applying options for *
debug1: Connecting to remotehost port 22.
debug1: Connection established.
debug1: identity file ./id_rsa type -1
debug1: identity file ./id_rsa-cert type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_53p1     Debian-3ubuntu7
debug1: match: OpenSSH_5.3p1 Debian-3ubuntu7 pat OpenSSH_5*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.1
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Server host key: RSA <removed>
debug1: Host remotehost is known and matches the RSA host key.
debug1: Found key in /home/user/.ssh/known_hosts:10
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
Ubuntu 10.04.4 LTS
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Trying private key: ./id_rsa
debug1: key_parse_private_pem: PEM_read_PrivateKey failed
debug1: read PEM private key done: type <unknown>
Enter passphrase for key './id_rsa':
debug1: read PEM private key done: type RSA
debug1: Authentication succeeded (publickey).
Authenticated to reoteserver:22).
debug1: channel 0: new [client-session]
debug1: Requesting [email protected]
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LANG = en_US.UTF-8
Steve
quelle

Antworten:

6

Ich konnte Ihre Symptome mithilfe eines öffentlichen und eines privaten Schlüssels reproduzieren, die nicht zueinander passten. Selbst wenn beide Schlüssel von autorisierten Schlüsseln zugelassen werden, schlägt die Anmeldung fehl, wenn der öffentliche und der private Schlüssel nicht übereinstimmen.

Nach allem, was ich sagen kann, passiert Folgendes.

  1. Der Client bemerkt, dass der private Schlüssel verschlüsselt ist
  2. Der Client hat die Datei mit dem öffentlichen Schlüssel gelesen
  3. Der Client bietet dem Server diesen Schlüssel an
  4. Der Server akzeptiert den öffentlichen Schlüssel
  5. Der Client fordert zur Eingabe des Kennworts auf
  6. Benutzer gibt Passwort ein
  7. Der Client setzt die Authentifizierung mit einem nicht übereinstimmenden privaten Schlüssel fort

Wenn Sie den öffentlichen Schlüssel entfernen, fragt der Client nach einem Kennwort, ohne zu wissen, ob der Server den Schlüssel akzeptiert. Dies bedeutet, dass Sie möglicherweise aufgefordert werden, das Kennwort für einen privaten Schlüssel einzugeben, um festzustellen, dass der Server es ohnehin nicht akzeptiert.

Kasperd
quelle
2

Dies kann ein Fehler in OpenSSH oder der Schlüssel in den Servern sein, authorized_keysund Ihr privater Schlüssel stimmt schließlich nicht überein. Wenn die Authentifizierung erfolgreich ist, erhalten Sie

debug1: identity file ./id_rsa type -1

Dies bedeutet, dass OpenSSH in dieser Phase keine Identitätsdatei (ich denke öffentlicher Schlüssel) laden kann. Im Quellcode im Schlüsselladeteil befindet sich dieses Snippet ( authfile.c):

/* try ssh2 public key */
pub = key_new(KEY_UNSPEC);
if (key_try_load_public(pub, filename, commentp) == 1)
    return pub;
if ((strlcpy(file, filename, sizeof file) < sizeof(file)) &&
    (strlcat(file, ".pub", sizeof file) < sizeof(file)) &&
    (key_try_load_public(pub, file, commentp) == 1))
    return pub;

-iDies bedeutet, dass OpenSSH versucht, die Angaben in Parameter + ".pub" als öffentlichen Schlüssel zu laden, und wie im Protokoll angegeben erfolgreich ist. Ohne den öffentlichen Schlüssel mit dem Suffix ".pub" im aktuellen Verzeichnis schlägt dies fehl. Später bei der Authentifizierung ( sshconnect2.c):

/*
 * send a test message if we have the public key. for
 * encrypted keys we cannot do this and have to load the
 * private key instead
 */
    if (id->key && id->key->type != KEY_RSA1) {
        debug("Offering %s public key: %s", key_type(id->key),
            id->filename);
        sent = send_pubkey_test(authctxt, id);
    } else if (id->key == NULL) {
        debug("Trying private key: %s", id->filename);
        id->key = load_identity_file(id->filename);
        if (id->key != NULL) {
            id->isprivate = 1;
            sent = sign_and_send_pubkey(authctxt, id);
            key_free(id->key);
            id->key = NULL;
        }
    }

Wenn der öffentliche Schlüssel vorhanden war, sendet OpenSSH ihn als Testnachricht (?), Die aus irgendeinem Grund fehlschlägt. Ohne vorinstallierten öffentlichen Schlüssel wird der private Schlüssel ausprobiert und ist erfolgreich.

Ich weiß nicht, warum der Fehler mit dem öffentlichen Schlüssel auftritt (wenn ich Zeit habe, werde ich versuchen, mehr herauszufinden). Es gibt möglicherweise eine gewisse Nichtübereinstimmung der Dateien im .ssh/Vergleich zu anderen Pfaden, oder es gibt schließlich eine gewisse Nichtübereinstimmung mit Ihren Schlüsseln.

Isido
quelle
0

Ich bin mir fast sicher, dass es sich um ein Berechtigungsproblem handelt. Überprüfen Sie die Ordnerberechtigungen, um sicherzustellen, dass sie nicht 770aber 740oder ähnlich sind. Wenn Sie das .sshVerzeichnis nicht verwenden, kann dies leicht zu dem aufgetretenen Problem führen.

Verwenden Sie zum Korrigieren chmod o-w /root. Ich empfehle dringend , einen dedizierten Ordner für diese Schlüssel zu verwenden, da die Berechtigungseinstellungen für Basisordner schwierig sind.

Nathan C.
quelle