key_load_public: formato inválido

99

Eu usei o PuTTY Key Generator para gerar uma chave RSA-2 de 4096 bits com uma senha longa.

Eu salvo o .ppk e uma chave pública no formato openSSL. A chave pública do formato putty não funciona.

Em qualquer caso, meu erro é o seguinte:

$ ssh -T [email protected]
key_load_public: invalid format
Enter passphrase for key '/c/Users/Dan/.ssh/id_rsa':
Hi Dan! You've successfully authenticated, but GitHub does not provide shell access.

Qual é o problema?

Eu uso o Pageant para carregar as chaves e o Git Bash para tentar a conexão ssh. Também carreguei a chave no GitHub, não tenho certeza do que estou fazendo de errado.

Eu tentei adicionar uma nova linha e não adicionar uma nova linha no GitHub

JordanGS
fonte
Por que você acha que não funciona? Diz autenticado com sucesso .
Roland Smith,
2
@RolandSmith Ele está me dizendo key_load_public: invalid formatexatamente enquanto executo o comando, antes de inserir a senha longa?
JordanGS,
1
Faça: 'ssh -vvv -T [email protected]' para obter mais informações, provavelmente ~ / .ssh / known_hosts é ruim - ssh está procurando a chave pública do github. Você pode executar 'chave de arquivo' para descobrir o formato do arquivo de chave.
mosh

Respostas:

183

Como Roland mencionou em sua resposta, é um aviso de que o ssh-agentnão entende o formato da chave pública e mesmo assim, a chave pública não será usada localmente.

No entanto, também posso elaborar e responder por que o aviso está lá. Simplesmente se resume ao fato de que o PuTTY Key Generator gera dois formatos diferentes de chave pública, dependendo do que você faz no programa.

Nota: Ao longo de minha explicação, os arquivos-chave que estarei usando / gerando serão nomeados id_rsacom suas extensões apropriadas. Além disso, para conveniência de copiar e colar, a pasta pai das chaves será considerada como sendo ~/.ssh/. Ajuste esses detalhes para atender às suas necessidades conforme desejado.

Os formatos

Link para a documentação relevante do PuTTY

SSH-2

Quando você salva uma chave usando o PuTTY Key Generator usando o botão "Salvar chave pública", ela é salva no formato definido pelo RFC 4716 .

Exemplo:

---- BEGIN SSH2 PUBLIC KEY ----
Comment: "github-example-key"
AAAAB3NzaC1yc2EAAAABJQAAAQEAhl/CNy9wI1GVdiHAJQV0CkHnMEqW7+Si9WYF
i2fSBrsGcmqeb5EwgnhmTcPgtM5ptGBjUZR84nxjZ8SPmnLDiDyHDPIsmwLBHxcp
pY0fhRSGtWL5fT8DGm9EfXaO1QN8c31VU/IkD8niWA6NmHNE1qEqpph3DznVzIm3
oMrongEjGw7sDP48ZTZp2saYVAKEEuGC1YYcQ1g20yESzo7aP70ZeHmQqI9nTyEA
ip3mL20+qHNsHfW8hJAchaUN8CwNQABJaOozYijiIUgdbtSTMRDYPi7fjhgB3bA9
tBjh7cOyuU/c4M4D6o2mAVYdLAWMBkSoLG8Oel6TCcfpO/nElw==
---- END SSH2 PUBLIC KEY ----

OpenSSH

Ao contrário da crença popular, este formato não é salvo pelo gerador. No entanto, ele é gerado e mostrado na caixa de texto intitulada "Chave pública para colar no arquivo OpenSSH authorized_keys". Para salvá-lo como um arquivo, você deve copiá-lo manualmente da caixa de texto e colá-lo em um novo arquivo de texto.

Para a chave mostrada acima, seria:

ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAhl/CNy9wI1GVdiHAJQV0CkHnMEqW7+Si9WYFi2fSBrsGcmqeb5EwgnhmTcPgtM5ptGBjUZR84nxjZ8SPmnLDiDyHDPIsmwLBHxcppY0fhRSGtWL5fT8DGm9EfXaO1QN8c31VU/IkD8niWA6NmHNE1qEqpph3DznVzIm3oMrongEjGw7sDP48ZTZp2saYVAKEEuGC1YYcQ1g20yESzo7aP70ZeHmQqI9nTyEAip3mL20+qHNsHfW8hJAchaUN8CwNQABJaOozYijiIUgdbtSTMRDYPi7fjhgB3bA9tBjh7cOyuU/c4M4D6o2mAVYdLAWMBkSoLG8Oel6TCcfpO/nElw== github-example-key

O formato da chave é simplesmente ssh-rsa <signature> <comment> e pode ser criado reorganizando o arquivo formatado SSH-2.

Regenerando chaves públicas

Se você estiver fazendo uso do ssh-agent, provavelmente também terá acesso assh-keygen .

Se você tiver sua chave privada OpenSSH ( id_rsaarquivo), poderá gerar o arquivo de chave pública OpenSSH usando:

ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pub

Se você tiver apenas a chave privada PUTTY ( id_rsa.ppkarquivo), será necessário convertê-la primeiro.

  1. Abra o gerador de chaves PuTTY
  2. Na barra de menu, clique em "Arquivo"> ​​"Carregar chave privada"
  3. Selecione seu id_rsa.ppkarquivo
  4. Na barra de menu, clique em "Conversões"> "Exportar chave OpenSSH"
  5. Salve o arquivo como id_rsa(sem extensão)

Agora que você tem uma chave privada OpenSSH, pode usar a ssh-keygenferramenta acima para realizar manipulações na chave.

Bônus: O formato de chave pública codificado por PEM PKCS # 1

Para ser honesto, não sei para que essa chave é usada, pois não precisava dela. Mas tenho isso em minhas anotações que compilei ao longo dos anos e vou incluí-lo aqui para bondade saudável. O arquivo terá a seguinte aparência:

-----BEGIN RSA PUBLIC KEY-----
MIIBCAKCAQEAhl/CNy9wI1GVdiHAJQV0CkHnMEqW7+Si9WYFi2fSBrsGcmqeb5Ew
gnhmTcPgtM5ptGBjUZR84nxjZ8SPmnLDiDyHDPIsmwLBHxcppY0fhRSGtWL5fT8D
Gm9EfXaO1QN8c31VU/IkD8niWA6NmHNE1qEqpph3DznVzIm3oMrongEjGw7sDP48
ZTZp2saYVAKEEuGC1YYcQ1g20yESzo7aP70ZeHmQqI9nTyEAip3mL20+qHNsHfW8
hJAchaUN8CwNQABJaOozYijiIUgdbtSTMRDYPi7fjhgB3bA9tBjh7cOyuU/c4M4D
6o2mAVYdLAWMBkSoLG8Oel6TCcfpO/nElwIBJQ==
-----END RSA PUBLIC KEY-----

Este arquivo pode ser gerado usando uma chave privada OpenSSH (conforme gerado em "Gerando novamente chaves públicas" acima) usando:

ssh-keygen -f ~/.ssh/id_rsa -y -e -m pem > ~/.ssh/id_rsa.pem

Como alternativa, você pode usar uma chave pública OpenSSH usando:

ssh-keygen -f ~/.ssh/id_rsa.pub -e -m pem > ~/.ssh/id_rsa.pem

Referências:

samthecodingman
fonte
Quando você converte sua chave privada em uma chave OpenSSH, é na minha opinião recomendar deixar o arquivo sem extensão e não preferível. Meu cliente git não se conecta ao repositório remoto quando uma extensão é usada para a chave privada.
Programador
@ Programmer1994 As instruções de conversão foram incluídas como etapas para converter o .ppkpara um .pubarquivo. O efeito colateral da id_rsachave privada intermediária realmente sendo usada por outro programa foi esquecido. Eu mudei a linguagem "preferencialmente sem extensão" para "(sem extensão)" para limpar qualquer ambiguidade. Também aproveitei a oportunidade para reformular algumas queixas que surgem sempre que olho para esta resposta. Obrigado por sua contribuição.
samthecodingman
Obrigado pela resposta. Usei o comando na seção de sua resposta "Regenerando chaves públicas" e ele resolveu meu problema.
desmond13
você falou sobre chaves públicas. mas o problema é gerado a partir de uma chave privada id_rsa. Recebo o mesmo aviso quando uso minha chave ssh privada ao tentar acessar um servidor git via ssh.
ahnbizcad de
5
ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pubisso resolveu. THX!
Dwza
16

Existe uma solução simples se você pode instalar e usar a ferramenta puttygen. Abaixo estão as etapas. Você deve ter a senha da chave privada.

etapa 1: Baixe o puttygen mais recente e abra o puttygen

etapa 2: carregue seu arquivo de chave privada existente, veja a imagem abaixo

Carregar uma chave privada existente

passo 3: digite a senha para a chave, se solicitado, e pressione ok

digite a paasphrase

passo 4: conforme mostrado na imagem abaixo, selecione a guia do menu "conversão" e selecione "Exportar chave OpenSSH"

salvar arquivo OpenSSH

Salve o novo arquivo de chave privada no local preferido e use de acordo.

PradeepNama
fonte
2
Recebi o load pubkey invalid formataviso quando exportei a chave com Exportar chave OpenSSH . Ele foi embora ao usar Exportar chave OpenSSH (forçar novo formato de arquivo) .
elsamuko
No Linux, apt install putty-toolsou yum install puttyentãosudo puttygen private.ppk -O private-openssh-new -o private.pem
Typel
9

TL; DR: certifique-se também de que id_rsa.pubestá em ascii / UTF-8.

Tive o mesmo problema, porém a resposta aceita sozinha não funcionou por causa da codificação do texto, que era um problema adicional fácil de ignorar.

Quando eu corro

ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pub

no Windows PowerShell, ele salva a saída id_rsa.pubem codificação UTF-16 LE BOM , não em UTF-8 . Esta é uma propriedade de algumas instalações do PowerShell, que foi discutida em Usando o PowerShell para gravar um arquivo em UTF-8 sem o BOM . Aparentemente, o OpenSSH não reconhece a codificação de texto anterior e produz um erro idêntico:

key_load_public: invalid format

Copiar e colar a saída de ssh-keygen -f ~/.ssh/id_rsa -yem um editor de texto é a maneira mais simples de resolver isso.

PS Isso poderia ser um acréscimo à resposta aceita , mas ainda não tenho carma suficiente para comentar aqui.

paperskilltrees
fonte
1
Como você descobriu, a tubulação funciona de maneira diferente no Powershell. Você usaria em ssh-keygen -f ~/.ssh/id_rsa -y | ac ~/.ssh/id_rsa.pubvez disso.
samthecodingman de
7

No caso de você copiar sua chave pública com a área de transferência e colá-la, pode acontecer que a string da chave pública que contém uma nova linha seja quebrada.

Certifique-se de que sua string de chave pública seja formada como uma linha.

Hojin Choi
fonte
5

Parece que sshnão consegue ler sua chave pública. Mas isso não importa.

Você carrega sua chave pública no github, mas autentica usando sua chave privada . Veja, por exemplo, a seção ARQUIVOS em ssh(1).

Roland Smith
fonte
2
Resumindo, vá para putty key gen, clique em conversões -> abra a chave ssh e salve-a em id_rsa - certifique-se de que sua variável de env HOME está apontando para a pasta .ssh que você está olhando, exclua todas as outras cópias do arquivo id_rsa de seu sistema
Kalpesh Soni
2

Em vez de salvar diretamente a chave privada, vá para Conversões e Exportar Chave SSh. Tive o mesmo problema e isso funcionou para mim

Jignesh Rawal
fonte
2

O erro é enganoso - ele diz " pubkey" enquanto aponta para um arquivo de chave privada ~/.ssh/id_rsa.

No meu caso, era simplesmente uma chave pública ausente (já que não a restaurei de um cofre).


DETALHES

Eu costumava pular a implantação ~/.ssh/id_rsa.pubpor scripts automatizados.

Todos os sshusos funcionaram, mas o erro me fez pensar em uma possível bagunça.

Nem um pouco - straceajudou a notar que o gatilho era na verdade o *.pubarquivo:

strace ssh example.com
...
openat(AT_FDCWD, "/home/uvsmtid/.ssh/id_rsa.pub", O_RDONLY) = -1 ENOENT (No such file or directory)
...
write(2, "load pubkey \"/home/uvsmtid/.ssh/"..., 57) = 57
load pubkey "/home/uvsmtid/.ssh/id_rsa": invalid format
uvsmtid
fonte
1

Eu tive o mesmo aviso. Era uma chave muito antiga. Eu gerei novamente uma chave no OpenSSH 7 atual e o erro foi embora.

Arberg
fonte
0

Então, após a atualização, tive o mesmo problema. Eu estava usando o PEM key_filesem extensão e simplesmente adicionando resolvi .pemmeu problema. Agora o arquivo está key_file.pem.

furang
fonte
0

Se você estiver usando o Windows 10 com o SSH integrado, a partir de agosto de 2020 ele só oferece suporte a chaves ed25519. Você obterá o key_load_public: invalid formaterro se usar, por exemplo, uma chave RSA.

Com relação a esse problema do GitHub, ele deve ser corrigido por meio do Windows Update em algum momento em 2020. Portanto, uma solução é apenas esperar o envio da atualização.

Se você não puder esperar, uma solução alternativa é gerar uma nova chave ed25519, o que é um bom conselho de qualquer maneira .

> ssh-keygen -o -a 100 -t ed25519

Você pode usá-lo, por exemplo, com o github, mas alguns sistemas mais antigos podem não suportar este formato mais recente.

Depois de gerar sua chave, se você estiver usando um dos recursos abaixo, não se esqueça de atualizá-los!

  1. ~\.ssh\config ainda pode apontar para a chave antiga.
  2. Adicione a nova chave ao ssh-agent por meio do ssh-addcomando
Vai
fonte