У меня действительно странная проблема, когда я пытаюсь подключиться по SSH к удаленному серверу.
Я делаю это из командной строки, а закрытый и открытый ключи находятся в моем текущем каталоге. Они называются id_rsa и id_rsa.pub соответственно. Я подтвердил с помощью отпечатка пальца, что они совпадают с открытым и закрытым ключами.
Когда я запускаю следующую команду:
ssh -vT -i ./id_rsa пользователь @ удаленный хост
Я получаю следующую ошибку: Permission denied (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
Мне удалось воспроизвести ваши симптомы, используя открытый и закрытый ключи, которые не соответствовали друг другу. Даже если оба ключа разрешены authorized_keys, вход в систему не выполняется, если открытый и закрытый ключи не совпадают.
Насколько я могу судить, происходит следующее.
Когда вы удаляете открытый ключ, клиент запрашивает пароль, не зная, примет ли сервер ключ. Это означает, что вас могут попросить ввести пароль для закрытого ключа только для того, чтобы обнаружить, что сервер все равно его не примет.
Это может быть ошибка в 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
. я очень рекомендую использовать выделенную папку для этих ключей, так как настройка разрешений для домашних папок - сложная задача.