Você não pode verificar quais teclas são aceitas no servidor sem efetuar login. A única maneira de saber se uma chave é aceita é tentar fazer login com ela.
Se houvesse uma maneira de listar quais chaves são aceitas para uma conta, isso seria uma violação da privacidade e tornaria as violações mais fáceis em algumas circunstâncias. O SSH nem mesmo informa se o nome da conta é válido: um login negado é um login negado, seja porque o nome da conta não é conhecido ou porque os dados de autenticação são inválidos. Fazer o contrário, pelo menos, violaria a privacidade, expondo quem tem uma conta na máquina. Também tornaria os ataques de força bruta contra contas com senhas fracas mais fáceis e mais difíceis de detectar em logs e em sistemas anti-intrusão, já que o invasor poderia se concentrar em contas existentes.
Cabe ao cliente SSH escolher qual (is) chave (s) ele tenta enviar para o servidor. Com o OpenSSH, isso pode ser configurado com a opção de configuração IdentityFile
(opção de linha de comando -i
) e selecionando as chaves a serem carregadas no agente ssh ou especificando a opção de configuração IdentitiesOnly
. O servidor envia um desafio (uma string gerada aleatoriamente) para o cliente. O cliente deve responder com o desafio assinado criptograficamente com uma chave privada, juntamente com a chave pública correspondente¹. O servidor verifica se a assinatura é uma assinatura válida do desafio com essa chave e se a combinação do nome de usuário solicitado e da chave pública é válida. (Normalmente, essa última parte significa que há uma linha com essa chave pública no arquivo ~/.ssh/authorized_keys
do usuário.) O cliente tem várias tentativas permitidas (depois de algumas, o servidor desistirá e fechará a conexão).
Se você esqueceu qual das suas chaves é válida para qual servidor, a maneira mais simples é efetuar login no servidor e verificar o arquivo ~/.ssh/authorized_keys
lá. Se a única maneira que você sabe de fazer login nesse servidor é tentar todas as chaves até conseguir, então você terá que fazer isso (o que, é claro, lhe dirá qual chave você pode usar, então você não precisa ler% código%). Se você tiver que fazer muitas tentativas na mesma conta, esteja preparado para o servidor fechar a conexão antes de terminar; aguarde alguns segundos e tente novamente.
Para referência futura, se você tiver muitas chaves diferentes, mantenha um ~/.ssh/authorized_keys
que tenha a diretiva .ssh/config
adequada para cada host.
¹ Estou simplificando o protocolo real , mantendo apenas o que é necessário aqui.