
У меня возникла очень странная проблема: я пытаюсь подключиться к удаленному серверу по SSH.
Я делаю это из командной строки, и оба ключа, закрытый и открытый, находятся в моем текущем каталоге. Они называются id_rsa и id_rsa.pub соответственно. Я проверил с помощью отпечатка пальца, что они соответствуют открытому и закрытому ключам.
Когда я даю следующую команду:
ssh -vT -i ./id_rsa пользователь@удаленный_хост
Я получаю следующую ошибку: Отказано в доступе (открытый ключ).
Однако если я переименую свой 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 [email protected]
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LANG = en_US.UTF-8
решение1
Мне удалось воспроизвести ваши симптомы, используя открытый ключ и закрытый ключ, которые не совпадали друг с другом. Даже если оба ключа разрешены authorized_keys, вход невозможен, когда открытый и закрытый ключи не совпадают.
Насколько я могу судить, происходит следующее.
- Клиент уведомляет, что закрытый ключ зашифрован
- Клиент прочитал файл открытого ключа
- Клиент предлагает этот ключ серверу
- Сервер принимает открытый ключ
- Клиент запрашивает пароль
- Пользователь вводит пароль
- Клиент продолжает аутентификацию, используя несоответствующий закрытый ключ
Когда вы удаляете открытый ключ, клиент запросит пароль, не зная, примет ли сервер ключ. Это означает, что вас могут попросить ввести пароль для закрытого ключа, а затем обнаружить, что сервер его все равно не примет.
решение2
Это может быть ошибка в 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/
обработке файлов по сравнению с другими путями, или все-таки есть несоответствие с вашими ключами.
решение3
Я почти уверен, что проблема в разрешениях. Проверьте разрешения папки, чтобы убедиться, что это не 770
but 740
или что-то подобное. Если вы не используете каталог, .ssh
это может легко вызвать проблему, с которой вы столкнулись.
Для исправления используйте chmod o-w /root
. Iвысокорекомендуем использовать отдельную папку для этих ключей, поскольку настройки прав доступа к домашним папкам сложны.