
Eu tenho um problema muito estranho em que estou tentando me conectar usando SSH a um servidor remoto.
Estou fazendo isso na linha de comando, e tanto a chave privada quanto a chave pública estão localizadas em meu diretório atual. Eles são nomeados id_rsa e id_rsa.pub respectivamente. Verifiquei por meio da impressão digital que elas correspondem às chaves pública e privada.
Quando eu emito o seguinte comando:
ssh -vT -i ./id_rsa usuário@remotehost
Recebo o seguinte erro: Permissão negada (chave pública).
No entanto, se eu renomear meu id_rsa.pub para outra coisa, tudo funcionará bem. O que poderia estar causando isso? Poderia ser uma configuração no servidor remoto que está causando isso?
A saída de -vT quando tenho o id_rsa.pub no mesmo diretório é (e falha):
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).
A saída de depuração quando eu renomeio 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
Responder1
Consegui reproduzir seus sintomas usando uma chave pública e uma chave privada, que não correspondiam. Mesmo que ambas as chaves sejam permitidas porauthorized_keys, o login falhará quando as chaves pública e privada não corresponderem.
Pelo que posso dizer, acontece o seguinte.
- O cliente percebe que a chave privada está criptografada
- O cliente leu o arquivo de chave pública
- O cliente oferece esta chave ao servidor
- O servidor aceita a chave pública
- Cliente solicita senha
- O usuário digita a senha
- O cliente continua a autenticação usando chave privada incompatível
Ao remover a chave pública, o cliente solicitará uma senha sem saber se o servidor aceitará a chave. Isso significa que você pode ser solicitado a digitar a senha de uma chave privada e descobrir que o servidor não a aceitará de qualquer maneira.
Responder2
Isso pode ser um bug no OpenSSH ou a chave no servidor authorized_keys
e sua chave privada não correspondem, afinal. Quando a autenticação for bem-sucedida, você obterá
debug1: identity file ./id_rsa type -1
o que significa que o OpenSSH não pode carregar o arquivo de identidade (acho que a chave pública) nesse estágio. No código fonte na parte de carregamento da chave existe este trecho ( 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;
Significa que o OpenSSH tentará carregar o que é fornecido no -i
parâmetro + ".pub" como chave pública e terá sucesso conforme indicado no log. Sem a chave pública com sufixo ".pub" no diretório atual, isso falhará. Posteriormente, ao fazer a autenticação ( 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;
}
}
Se a chave pública estiver presente, o OpenSSH irá enviá-la como uma mensagem de teste (?) que falhará por algum motivo. Sem a chave pública pré-carregada, ele tentará a chave privada e terá sucesso.
Não sei por que acontece a falha na chave pública (se tiver tempo, tentarei descobrir mais). Talvez haja alguma incompatibilidade nos arquivos .ssh/
manipulados em comparação com outros caminhos ou, afinal, há alguma incompatibilidade com suas chaves.
Responder3
Tenho quase certeza de que é um problema de permissões. Verifique as permissões da pasta para garantir que não seja 770
mas 740
ou semelhante. Se você não estiver usando o .ssh
diretório, isso poderá facilmente causar o problema que você está enfrentando.
Para corrigir, use chmod o-w /root
. EUaltamenterecomendo usar uma pasta dedicada para essas chaves, pois as configurações de permissões nas pastas iniciais são complicadas.