Закрытый ключ и открытый ключ в одном каталоге приводят к сбою ssh

У меня действительно странная проблема, когда я пытаюсь подключиться через SSH к удаленному серверу.

Я делаю это из командной строки, и закрытый ключ, и открытый ключ находятся в моем текущем каталоге. Они называются id_rsa и id_rsa.pub соответственно. С помощью отпечатка пальца я подтвердил, что они соответствуют открытым и закрытым ключам.

Когда я выдаю следующую команду:

ssh -vT -i./id_rsa user @ remotehost

Я получаю следующую ошибку: Отказано в доступе (publickey).

Тем не менее, если я переименую свой id_rsa.pub в другое, он будет работать нормально. Что может быть причиной этого? Может ли это быть настройка на удаленном сервере, который вызывает это?

Вывод из -vT, когда у меня есть id_rsa.pub в том же каталоге, (и это не удается):

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

Отладочный вывод, когда я переименую id_rsa.pub:

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 no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LANG = en_US.UTF-8

3 ответа

Решение

Я смог воспроизвести ваши симптомы с помощью открытого ключа и личного ключа, которые не совпадали друг с другом. Даже если оба ключа разрешены авторизованным ключом, вход в систему завершается неудачно, когда открытый и закрытый ключи не совпадают.

Из того, что я могу сказать, происходит следующее.

  1. Уведомление клиента о том, что закрытый ключ зашифрован
  2. Клиент прочитал файл открытого ключа
  3. Клиент предлагает этот ключ на сервер
  4. Сервер принимает открытый ключ
  5. Клиент запрашивает пароль
  6. Пользователь вводит пароль
  7. Клиент продолжает аутентификацию с использованием несовпадающего закрытого ключа

Когда вы удаляете открытый ключ, клиент запросит пароль, не зная, примет ли сервер ключ. Это означает, что вас могут попросить ввести пароль для закрытого ключа только для того, чтобы выяснить, что сервер все равно его не примет.

Это может быть ошибка в OpenSSH или ключ в сервере authorized_keys и ваш закрытый ключ не совпадает в конце концов. Когда аутентификация проходит успешно, вы получаете

debug1: identity file ./id_rsa type -1

Это означает, что OpenSSH не может загрузить файл идентификации (я думаю, открытый ключ) на этом этапе. В исходном коде в части загрузки ключа есть этот фрагмент (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;

Это означает, что OpenSSH будет пытаться загрузить то, что указано в -i параметр + ".pub" в качестве открытого ключа и успешно, как указано в журнале. Без открытого ключа с суффиксом ".pub" в текущем каталоге это не удастся. Позже при выполнении аутентификации (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;
        }
    }

Если открытый ключ присутствовал, OpenSSH отправит его как тестовое сообщение (?), Которое по какой-то причине не будет выполнено. Без предварительно загруженного открытого ключа он попробует закрытый ключ и преуспеет.

Я не знаю, почему происходит сбой с открытым ключом (если у меня будет время, я постараюсь выяснить больше). Возможно, некоторые файлы не совпадают .ssh/ обрабатываются по сравнению с другими путями, или есть какое-то несоответствие с вашими ключами в конце концов.

Я почти уверен, что это проблема с разрешениями. Проверьте разрешения папки, чтобы убедиться, что это не 770 но 740 или похожие. Если вы не используете .ssh каталог это может легко вызвать проблему, которую вы испытываете.

Чтобы исправить, используйте chmod o-w /root, Я настоятельно рекомендую использовать выделенную папку для этих ключей, так как настройки разрешений для домашних папок сложны.

Другие вопросы по тегам