Estou automatizando a geração de chaves com ssh-keygen
(OpenSSH v8.9), em um servidor headless. Isso é direto se nenhuma senha for necessária, mas fica difícil se você precisar de uma senha. ssh-keygen
precisa de 3 coisas no stdin ao gerar uma nova chave: y
, porque o arquivo de chaves já existe, e a senha necessária, repetida duas vezes.
Com alguma simplificação, estou fazendo isso da seguinte maneira:
$ printf -v input "y\npassword\npassword\n"
$ echo -n "$input"
y
password
password
$ echo -n "$input" | ssh-keygen -t ed25519 -a100 -f tmpkey
Quando fiz isso inicialmente, obtive esta saída:
Generating public/private ed25519 key pair.
tmpkey already exists.
Overwrite (y/n)? ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory
O par de chaves foi criado, mas a chave privada não foi criptografada. Então, eu instalei ssh-askpass
, em um sistema de teste com X. Quando eu executo ssh-keygen
agora, eu recebo um pop-up de autenticação OpenSSH, e stdin agora é ignorado. Obviamente, eu não posso ter um pop-up gráfico em um servidor headless, mesmo se eu quisesse.
Então o que está acontecendo? Posso persuadir ssh-keygen
a automatizar a entrada de senha? Se não, posso usar openssl
para adicionar uma senha ou até mesmo criar o arquivo? Eu quero obter uma chave de formato OpenSSH disso - já estou automatizando o PKCS#8 com o openssl.
EDITAR
Eu encontrei o SSH_ASKPASS_REQUIRE
envvar para ssh
(não ssh-keygen
). Se eu configurá-lo para 'never', ele para o ssh-askpass
popup, mas ssh-keygen
agora lê apenas a primeira linha de stdin e ignora a senha nas próximas duas linhas. Então, não me leva a lugar nenhum.
Em vez disso, você pode gerar a chave usando PuTTYgen, como dave_thompson_085 apontou nos comentários. Spoiler: você provavelmente não quer fazer isso, pois
puttygen
parece ter suporte OpenSSH incompleto.Isso lhe dará uma chave privada OpenSSH:
A frase-senha está em
stdin
, e a chave vai parastdout
, então não há nada registrado no seu histórico bash, ou naps
saída. Agora você pode obter a chave pública como:Até agora, isso é muito melhor do que
ssh-keygen
. No entanto, a mosca na sopa é-a100
. O procedimento acima gera um arquivo de chave com os 16 rounds KDF padrão.Os
puttygen
documentos (na verdade, a página do manual; não há documentos escritos, eu acho) não são claros sobre a configuração do número de rodadas KDF, mas parece que você pode definir isso com--ppk-param passes=$rounds
. Isso parece funcionar se você estiver gerando um arquivo PuTTY PPK, mas não funciona para um arquivo OpenSSH.puttygen
não reclama, mas o arquivo de chave ainda mostra 16 rodadas, e fazerrounds
um número grande não faz diferença no tempo necessário para descriptografar a chave. Para encontrar o número de rodadas codificadas no arquivo, veja a resposta de Gilles aqui .A menos que eu tenha perdido algo na página do manual, isso torna
puttygen
bem inútil gerar chaves OpenSSH com frases-senha . Eu pessoalmente usariassh-keygen
e espero que ninguém esteja olhando quando você estiver criando as chaves. Até onde eu posso entender, você também não pode usarputtygen
para alterar o comentário no arquivo de chaves.A maneira de fornecer a senha é usando
-N
:É claro que você deve fornecer à variável
input
um conteúdo como o seu: