O macOS Sierra parece não se lembrar das chaves SSH entre as reinicializações

184

Eu tenho que executar este comando desde a atualização para o macOS:

ssh-add -K

Corrige o problema após a reinicialização, mas tenho que executar este comando toda vez que faço logon no meu computador.

Se eu não executar o comando acima, minhas chaves ~/.sshserão ignoradas e a senha do servidor será solicitada para estabelecer a conexão.

bisherbas
fonte
1
$ ssh-add -Kme dássh-add: illegal option -- K
modius
1
Você precisará inserir o caminho da chave privada depois -K. Veja a resposta de @JakeGould para resolução.
bisherbas
A atualização 10.12.2 eliminou algumas solicitações desnecessárias de senha do servidor para mim. Agora você pode não precisar mais executar o ssh-add -K.
Wayfaring Stranger

Respostas:

216

No macOS Sierra 10.12.2, a Apple adicionou uma ssh_configopção chamada UseKeychainque permite uma resolução 'adequada' para o problema. Adicione o seguinte ao seu ~/.ssh/configarquivo:

Host *
   AddKeysToAgent yes
   UseKeychain yes     

Na ssh_config manpágina 10.12.2:

UseKeychain

No macOS, especifica se o sistema deve procurar senhas nas chaves do usuário ao tentar usar uma chave específica. Quando a frase secreta é fornecida pelo usuário, essa opção também especifica se a frase secreta deve ser armazenada no chaveiro depois que se verificar que está correta. O argumento deve ser 'yes' ou 'no'. O padrão é 'não'.

mluisbrown
fonte
2
De acordo com este link: openradar.appspot.com/27348363 A Apple "re-alinhou [seu] comportamento com o OpenSSH convencional nesta área".
Thomasw
15
É absurdo que a Apple modifique o comportamento de uma maneira que cause problemas para a grande maioria dos desenvolvedores (por causa do impulso do GitHub, se nada mais) e não disse nada a ninguém!
mluisbrown
9
Eu acho que o IdentityFile ~/.ssh/id_rsaé redundante e não é necessário (ao olhar para as opções padrão). Eu nunca defini essa opção no meu arquivo de configuração ssh.
Therealmarv
9
A mudança na IMO do @JakeGould ~/.ssh/config~é preferível, pois resolve o problema no sshnível. Não tenho 100% de certeza de que o .bash_profilemod funcionará para clientes da GUI usando ssh sem usar um shell.
mluisbrown
7
A Apple publicou a Nota técnica TN2449 sobre essa alteração.
Kentzo
106

Eu tive esse problema também ao tentar implantar algum código usando o Capistrano . Muito frustrante. Aqui estão dois métodos que eu conheço para lidar com esse problema.

Método 1: Adicione todas as chaves conhecidas ao agente SSH.

Portanto, uma solução que encontrei é executar ssh-addcom a -Aopção - que adiciona todas as identidades conhecidas ao agente SSH usando quaisquer senhas armazenadas no seu conjunto de chaves - da seguinte maneira:

ssh-add -A

Agora isso funciona, mas não persistirá durante as reinicializações. Portanto, se você nunca mais se preocupar com isso, abra o ~/.bash_profilearquivo do usuário assim:

nano ~/.bash_profile

E adicione esta linha na parte inferior:

ssh-add -A 2>/dev/null;

Agora, quando você abre uma nova janela do Terminal, tudo deve ficar bom!

Método 2: Adicione apenas chaves SSH que estão no conjunto de chaves ao agente.

Portanto, embora a ssh-add -Aopção funcione nos casos mais básicos, encontrei recentemente um problema em que havia 6-7 caixas do Vagrant (que usam chaves / identidades SSH para acesso) configuradas em uma máquina, além das mais comuns id_rsa.pub.

Para encurtar a história, acabei sendo bloqueado de um servidor remoto devido a muitas tentativas falhas com base em chaves / identidades SSH, uma vez que o acesso ao servidor foi baseado em uma senha e as chaves / identidades SSH são chaves / identidades SSH. Portanto, o agente SSH tentou todas as minhas chaves SSH, falhou e eu nem consegui acessar o prompt de senha.

O problema é que ssh-add -Avocê adiciona arbitrariamente todas as chaves / identidades SSH que você possui ao agente, mesmo que não seja necessário; como no caso de caixas Vagrant.

Minha solução após muitos testes foi a seguinte.

Primeiro, se você tiver mais chaves / identidades SSH adicionadas ao seu agente do que precisa, conforme mostrado em ssh-add -lseguida, limpe todas elas do agente da seguinte maneira:

ssh-add -D

Feito isso, inicie o agente SSH como um processo em segundo plano, assim:

eval "$(ssh-agent -s)"

Agora, fica estranho e não sei muito bem o porquê. Em alguns casos, você pode adicionar especificamente a ~/.ssh/id_rsachave / identidade ao agente da seguinte maneira:

ssh-add ~/.ssh/id_rsa

Digite sua senha, aperte Returne você deve estar pronto.

Mas em outros casos, basta executar isso para obter a chave / identidade adicionada:

ssh-add -K

Se tudo estiver funcionando, digite ssh-add -le você verá uma única chave / identidade SSH listada.

Tudo bom? Agora abra seu .bash_profile:

nano ~/.bash_profile

E adicione esta linha na parte inferior; comente ou remova a -Aversão se você a tiver:

ssh-add -K 2>/dev/null;

Isso permitirá que a chave / identidade SSH seja recarregada no agente SSH em cada inicialização / reinicialização.

ATUALIZAÇÃO: A Apple agora adicionou uma UseKeychainopção às opções de configuração abertas do SSH e considera ssh-add -Auma solução também.

A partir do macOS Sierra 10.12.2, a Apple adicionou uma UseKeychainopção de configuração para configurações SSH. A verificação da página de manual (via man ssh_config) mostra as seguintes informações:

UseKeychain
        On macOS, specifies whether the system should search for
        passphrases in the user's keychain when attempting to use a par-
        ticular key. When the passphrase is provided by the user, this
        option also specifies whether the passphrase should be stored
        into the keychain once it has been verified to be correct.  The
        argument must be ``yes'' or ``no''.  The default is ``no''.

O que significa que a Apple vê a solução como uma adição ssh-add -Aà sua, .bash_profile conforme explicado neste ticket de Radar Aberto ou UseKeychaincomo uma das opções em uma por usuário ~/.ssh/config.

JakeGould
fonte
4
@modius: se você tiver uma chave protegida por pw, ssh-add -K [path to key]digite e digite pw quando solicitado. O Keychain armazenará a senha e o ssh-add a obterá depois disso.
Timo
2
Observe que -A é para adicionar identidades ao agente usando quaisquer senhas armazenadas em seu chaveiro. Se você possuir identidades sem senhas, precisará omitir a opção -A para adicioná-las ao seu agente.
Evan Pon
12
Apenas para adicionar um pouco mais de visibilidade, a Apple atualizou a página de manual do ssh_config para incluir UseKeychaine AddKeysToAgentadicionar automaticamente suas chaves do ssh_config. Nenhum script de shell é necessário. Veja @mluisbrown resposta abaixo para obter as informações atualizadas para 10.12.2
Ryan Gibbons
1
@JakeGould eu entendo o que você está dizendo, eu realmente gosto do que eles estão fazendo. Em vez de salvar automaticamente a senha na chaveiro e carregá-la na inicialização, elas estão dando a você o controle de sua segurança. / shrug
Ryan Gibbons
1
@RyanGibbons FWIW, olhar para a sugestão oficial da Apple Developer Relations nesta resposta em OpenRadar: “Você pode corrigir isso com bastante facilidade, executando ssh-add -Aem seu script rc se você quiser suas chaves sempre ser carregado.” ¯\_(ツ)_/¯
JakeGould
16

Conforme explicado aqui , este é o método recomendado desde o macOS 10.12.2 :

  1. Adicione as seguintes linhas ao seu ~/.ssh/configarquivo:

    Host *
        UseKeychain yes
        AddKeysToAgent yes
  2. Qualquer chave que você adicionar ao ssh-agent usando o ssh-add /path/to/your/private/key/id_rsacomando será automaticamente adicionada ao chaveiro e deverá ser carregada automaticamente na reinicialização.


Estou adicionando esta resposta porque:

  • Outras respostas dizem para você adicionar a IdentityFile ~/.ssh/id_rsalinha, mas essa opção não é necessária para o carregamento automático das chaves (e, na verdade, vincula essa chave específica para a seção do host à qual você a adiciona, o que você não desejará se usar chaves diferentes para hots diferentes).
  • A resposta aceita menciona UseKeychain, mas isso não é suficiente para manter as chaves ssh-agentapós uma reinicialização.
Ricardo Sanchez-Saez
fonte
1
Em relação ao segundo ponto. Quão certo você tem? Na verdade, nada acontece na reinicialização e isso também não é mencionado no seu material de referência. O que acontece com a configuração acima é que seu cliente SSH carregará a chave no agente na primeira conexão (e também buscará a senha da chaveiro), e a chave permanecerá carregada. Você pode verificar esta declaração listando as chaves logo após a reinicialização via ssh-add -Le será relatado The agent has no identities. Nada estará lá até você se conectar. O AddKeysToAgentnão persiste chaves entre reinicializações de forma alguma!
Danila Vershinin
15

Eu escrevi um pequeno post sobre este tópico que pode ajudá-lo.

Uma solução está chamando o ssh-add -Acomando em cada inicialização.

Basta adicionar um .plistarquivo com o seguinte conteúdo ao caminho ~/Library/LaunchAgents/ou criar um com o aplicativo Lingon :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>ssh-add-a</string>
    <key>ProgramArguments</key>
    <array>
        <string>ssh-add</string>
        <string>-A</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

<!-- @@@@LingonWhatStart:ssh-add -A@@@@LingonWhatEnd -->
Jirsbek
fonte
8

Desde o macOS 10.12.2, você pode usar a UseKeychainopção Leia mais aqui ou veja man ssh_config.

     UseKeychain
         On macOS, specifies whether the system should search for passphrases in the user's keychain
         when attempting to use a particular key. When the passphrase is provided by the user, this
         option also specifies whether the passphrase should be stored into the keychain once it has
         been verified to be correct.  The argument must be ``yes'' or ``no''.  The default is ``no''.

Então, faça o seguinte:

echo "UseKeychain yes" >> ~/.ssh/config

Ben
fonte
1
O uso >>está em risco se você inserir o comando várias vezes. Melhor fazer uma edição manual do arquivo, conforme descrito pela resposta mluisbrown ou ChrisJF .
Coeur
Você está ali mesmo :-)
Ben
4

Eu achei que ssh-add -Kme deu " opção ilegal - K ". Isso ocorreu porque o ssh-add era uma versão estranha vinda de / usr / local / bin (instalada pelo brew?). Consegui adicionar a chave pelo uso específico do ssh-add localizado em / usr / bin:

/usr/bin/ssh-add -K ~/.ssh/id_rsa
Fiskabollen
fonte
foi isso que funcionou para mim depois de deixar de trabalhar com facilidade por séculos.
nyxee 04/10
4

Eu já tinha esse problema e encontrei uma maneira de contornar isso. Acabei de criar um arquivo nomeado configna minha ~/.sshpasta, onde adicionei as seguintes linhas:

Host github.com
HostName github.com
IdentityFile ~/.ssh/github
IdentitiesOnly yes

Não sei por que, mas Hoste HostNameambos são importantes. No meu caso, se um deles não estivesse presente, a solução não funcionaria.

Então, eu apenas fiz um ssh-add -Ke estava funcionando mesmo após o reinício.

Infinidade
fonte
1
Host é seu nome / alias definido pelo usuário para um servidor específico e demarca entradas por servidor: estilisticamente, é bom recuar as linhas que seguem a entrada Host. HostName indica o nome endereçável da rede do servidor, como github.com, mas você também pode usar um endereço IP. Host e HostName não precisam ser a mesma coisa, mas sim, ambos são parte integrante do formato de configuração ssh.
Mark Fox
4

Se você estiver usando uma versão diferente do ssh (por exemplo, instalada via homebrew), as soluções acima não funcionarão imediatamente. Por exemplo, AddKeysToAgent yese UseKeychain yesno .ssh/configarquivo não são reconhecidos por versões ssh que não são da Apple e causarão um erro. O mesmo para a opção -Aou -Kpara o sshcliente.

Isso significa que a resposta de @mluisbrown não funcionará. Você pode usar o método 1 da resposta de @JakeGould e usar explicitamente o ssh-addutilitário macOS no seu .bash_profilepara adicionar todas as chaves ao chaveiro, ou seja:

/usr/bin/ssh-add -A

Como mencionado no comentário acima , você pode precisar adicionar uma chave ao chaveiro primeiro: por exemplo/usr/bin/ssh-add -K .ssh/github

n1000
fonte
2

Alterar ~ / .ssh / config para adicionar UseKeyChain a todos os hosts é suficiente para interromper esse pesadelo recorrente;)

Host *
 UseKeychain yes

Se o arquivo estiver vazio ou não existir, basta criar e / ou adicionar a configuração acima.

chim
fonte
1

Atualizei para o Mac OS X Sierra (10.12.6). Eu poderia ssh em outros hosts, mas não no github.com.

Isto é o que eu tive que inserir em ~ / .ssh / config:

PubkeyAcceptedKeyTypes ssh-dss,ssh-rsa

Após essa alteração, eu poderia usar o github como antes.

Matthias Bohlen
fonte