macOS Sierra non sembra ricordare le chiavi SSH tra i riavvii


185

Devo eseguire questo comando dall'aggiornamento a macOS:

ssh-add -K

Correzione del problema dopo il riavvio, ma devo eseguire questo comando ogni volta che accedo al mio computer.

Se non eseguo il comando sopra, le mie chiavi ~/.sshvengono ignorate e mi viene richiesta la password del server per stabilire la connessione.


1
$ ssh-add -Kmi dàssh-add: illegal option -- K
modius

1
Dopo dovrai inserire il percorso della chiave privata -K. Vedi la risposta di @JakeGould per la risoluzione.
bisherbas,

L'aggiornamento 10.12.2 ha eliminato per me alcune richieste di password del server non necessarie. Ora potrebbe non essere più necessario eseguire ssh-add -K.
Wayfaring Stranger

Risposte:


216

A partire da macOS Sierra 10.12.2, Apple ha aggiunto ssh_configun'opzione chiamata UseKeychainche consente una risoluzione "corretta" del problema. Aggiungi quanto segue al tuo ~/.ssh/configfile:

Host *
   AddKeysToAgent yes
   UseKeychain yes     

Dalla ssh_config manpagina del 10.12.2:

UseKeychain

Su macOS, specifica se il sistema deve cercare passphrase nel portachiavi dell'utente quando tenta di utilizzare una chiave particolare. Quando la passphrase viene fornita dall'utente, questa opzione specifica anche se la passphrase deve essere archiviata nel portachiavi una volta verificato che sia corretto. L'argomento deve essere "sì" o "no". L'impostazione predefinita è "no".


2
Secondo questo link: openradar.appspot.com/27348363 Apple ha "riallineato il [suo] comportamento con il mainstream OpenSSH in quest'area".
ThomasW,

15
È assurdo che Apple abbia modificato il comportamento in modo da causare problemi alla stragrande maggioranza degli sviluppatori (a causa della spinta di GitHub se non altro) e non ha detto nulla a nessuno!
mluisbrown,

9
Penso che IdentityFile ~/.ssh/id_rsasia ridondante e non necessario (quando si osservano le opzioni predefinite). Non ho mai impostato questa opzione nel mio file di configurazione SSH.
therealmarv,

9
@JakeGould ~/.ssh/config~È preferibile cambiare IMO in quanto risolve il problema a sshlivello. Non sicuro al 100% che la .bash_profilemod funzionerà per i client GUI che usano ssh senza usare una shell.
mluisbrown,

7
Apple ha pubblicato la nota tecnica TN2449 relativa a tale modifica.
Kentzo

107

Ho avuto questo problema anche quando ho tentato di distribuire un codice usando Capistrano . Molto frustrante. Ecco due metodi che conosco per affrontare questo problema.

Metodo 1: aggiungere tutte le chiavi note all'agente SSH.

Quindi una soluzione che ho trovato è quella di eseguire ssh-addcon l' -Aopzione — che aggiunge tutte le identità conosciute all'agente SSH usando qualsiasi passphrase memorizzata nel tuo portachiavi — in questo modo:

ssh-add -A

Ora funziona ma non persiste per tutti i riavvi. Quindi, se non vuoi più preoccuparti di questo, apri il ~/.bash_profilefile del tuo utente in questo modo:

nano ~/.bash_profile

E aggiungi questa riga in fondo:

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

Ora quando apri una nuova finestra Terminale, tutto dovrebbe andare bene!

Metodo 2: aggiungere solo le chiavi SSH presenti nel portachiavi all'agente.

Quindi, mentre l' ssh-add -Aopzione dovrebbe funzionare per la maggior parte dei casi di base, di recente ho riscontrato un problema in cui avevo installato 6-7 scatole Vagrant (che utilizzano chiavi / identità SSH per l'accesso) su una macchina in cima alle più comuni id_rsa.pubin atto.

Per farla breve, ho finito per essere bloccato fuori da un server remoto a causa di troppi tentativi falliti basati su chiavi / identità SSH poiché l'accesso al server era basato su una password e le chiavi / identità SSH sono chiavi / identità SSH. Quindi l'agente SSH ha provato tutte le mie chiavi SSH, non è riuscito e non sono nemmeno riuscito a visualizzare la richiesta della password.

Il problema è che ssh-add -Aaggiungerà arbitrariamente ogni singola chiave / identità SSH che hai all'agente anche se non è necessario farlo; come nel caso delle scatole Vagrant.

La mia soluzione dopo molti test è stata la seguente.

Innanzitutto, se hai più chiavi / identità SSH aggiunte al tuo agente di quante ne hai bisogno, come mostrato, ssh-add -lquindi eliminale tutte dall'agente in questo modo:

ssh-add -D

Fatto ciò, avvia l'agente SSH come un processo in background in questo modo:

eval "$(ssh-agent -s)"

Ora, diventa strano e non sono troppo sicuro del perché. In alcuni casi è possibile aggiungere in modo specifico la ~/.ssh/id_rsachiave / identità all'agente in questo modo:

ssh-add ~/.ssh/id_rsa

Digita la passphrase, premi Returne dovresti essere a posto.

Ma in altri casi semplicemente eseguirlo è sufficiente per ottenere la chiave / identità aggiunta:

ssh-add -K

Se tutto ha funzionato, digita ssh-add -le dovresti vedere una sola chiave / identità SSH elencata.

Tutto bene? Ora apri il tuo .bash_profile:

nano ~/.bash_profile

E aggiungi questa linea in fondo; commentare o rimuovere la -Aversione se è presente:

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

Ciò consentirà di ricaricare la chiave / identità SSH nell'agente SSH ad ogni avvio / riavvio.

AGGIORNAMENTO: Apple ha ora aggiunto UseKeychainun'opzione alle opzioni di configurazione SSH aperte e considera anche ssh-add -Auna soluzione.

A partire da macOS Sierra 10.12.2, Apple ha aggiunto UseKeychainun'opzione di configurazione per le configurazioni SSH. Il controllo della pagina man (via man ssh_config) mostra le seguenti informazioni:

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''.

Il che si riduce ad Apple vedendo la soluzione come aggiunta ssh-add -Aal tuo .bash_profile come spiegato in questo ticket Open Radar o aggiunta UseKeychaincome una delle opzioni in un utente ~/.ssh/config.


4
@modius: se hai una chiave protetta da pw, esegui ssh-add -K [path to key]e inserisci pw quando richiesto. Il portachiavi memorizzerà la password e ssh-add lo otterrà da lì in seguito.
Timo,

2
Nota che -A serve per aggiungere identità all'agente usando qualsiasi passphrase memorizzata nel tuo portachiavi. Se hai anche identità senza passphrase, dovrai omettere l'opzione -A per aggiungerle al tuo agente.
Evan Pon,

12
Solo per aggiungere un po 'più di visibilità a questo, Apple ha aggiornato la pagina man affinché ssh_config includa UseKeychaine AddKeysToAgentaggiunga automaticamente le tue chiavi da ssh_config. Non sono necessari script di shell. Vedi la risposta @mluisbrown di seguito per le informazioni aggiornate per il 10.12.2
Ryan Gibbons,

1
@JakeGould ricevo quello che stai dicendo, in realtà mi piace quello che stanno facendo. Invece di salvare automaticamente la passphrase sul Portachiavi e caricarlo all'avvio, ti danno il controllo della tua sicurezza. / scrollata di spalle
Ryan Gibbons,

1
@RyanGibbons FWIW, guarda il suggerimento ufficiale di Apple Developer Relations in questa risposta su OpenRadar: "Puoi risolverlo abbastanza facilmente eseguendo il ssh-add -Atuo script rc se vuoi che le tue chiavi siano sempre caricate". ¯\_(ツ)_/¯
JakeGould

16

Come spiegato qui , questo è il metodo consigliato da macOS 10.12.2 :

  1. Aggiungi le seguenti righe al tuo ~/.ssh/configfile:

    Host *
        UseKeychain yes
        AddKeysToAgent yes
    
  2. Qualsiasi chiave aggiunta a ssh-agent usando il ssh-add /path/to/your/private/key/id_rsacomando verrà automaticamente aggiunta al portachiavi e dovrebbe essere caricata automaticamente al riavvio.


Sto aggiungendo questa risposta perché:

  • Altre risposte ti dicono di aggiungere la IdentityFile ~/.ssh/id_rsalinea, ma quell'opzione non è necessaria per caricare automaticamente le chiavi (e in realtà vincolerà quella particolare chiave per la sezione host a cui la aggiungi, che non vorrai se usi chiavi diverse per punti diversi).
  • La risposta accettata menziona UseKeychain, ma ciò non è sufficiente per rendere persistenti le chiavi ssh-agentdopo un riavvio.

1
Per quanto riguarda il secondo punto. Quanto sei sicuro? In realtà non accade nulla al riavvio e non è nemmeno menzionato nel materiale di riferimento. Quello che succede con la configurazione di cui sopra è che il tuo client SSH caricherà la chiave nell'agente alla prima connessione (e recupererà anche la passphrase dal portachiavi), quindi la chiave rimarrà caricata. È possibile verificare questa affermazione elencando le chiavi subito dopo il riavvio tramite ssh-add -Le verrà segnalato The agent has no identities. Nulla sarà lì finché non ti connetti. Le AddKeysToAgentchiavi non persistono tra i riavvii in alcun modo!
Danila Vershinin,

15

Ho scritto un breve post su questo argomento che potrebbe aiutarti.

Una soluzione chiama il ssh-add -Acomando ad ogni avvio.

Basta aggiungere il .plistfile con il seguente contenuto al percorso ~/Library/LaunchAgents/o crearne uno con l' app 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 -->

8

Da macOS 10.12.2 è possibile utilizzare l' UseKeychainopzione. Leggi di più qui o guarda in 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''.

Quindi, procedi come segue:

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


1
L'uso >>è a rischio se si immette il comando più volte. Meglio fare un'edizione manuale del file, come descritto dalla risposta mluisbrown o ChrisJF .
Cœur il

Sei proprio lì :-)
Ben

4

Ho scoperto che ssh-add -Kmi ha dato " opzione illegale - K ". Questo perché ssh-add era una strana versione proveniente da / usr / local / bin (installato da brew?). Sono stato in grado di aggiungere la chiave mediante l'uso specifico di ssh-add che si trova in / usr / bin:

/usr/bin/ssh-add -K ~/.ssh/id_rsa

questo è ciò che ha funzionato per me dopo aver fallito nel lavorare facilmente per anni.
nyxee

4

Ho avuto questo problema prima e ho trovato un modo per aggirare questo. Ho appena creato un file chiamato confignella mia ~/.sshcartella, dove ho aggiunto le seguenti righe:

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

Non sono sicuro del perché, ma Hosted HostNameentrambi sono importanti. Nel mio caso, se uno di questi non era presente, la soluzione non funzionava.

Quindi, l'ho appena fatto ssh-add -Ke funzionava anche dopo il riavvio.


1
Host è il tuo nome / alias definito dall'utente per un determinato server e delimita le voci per server: stilisticamente è bello rientrare le righe che seguono la voce Host. Nomehost indica il nome indirizzabile della rete del server come github.com, ma è possibile utilizzare anche un indirizzo IP. Host e HostName non devono essere la stessa cosa, ma sì, sono entrambi parte integrante del formato di configurazione ssh.
Mark Fox,

4

Se si utilizza una versione diversa di ssh (ad es. Installata tramite homebrew), le soluzioni di cui sopra non funzioneranno immediatamente. Ad esempio, AddKeysToAgent yese UseKeychain yesnel .ssh/configfile non sono riconosciuti da versioni ssh non Apple e causeranno un errore. Lo stesso per l' opzione -Ao -Kper il sshclient.

Ciò significa che la risposta di @mluisbrown non funzionerà affatto. Puoi usare il metodo 1 della risposta di @JakeGould e usare esplicitamente l' ssh-addutility macOS nel tuo .bash_profileper aggiungere tutte le chiavi al portachiavi, ovvero:

/usr/bin/ssh-add -A

Come menzionato in precedenza in un commento , potrebbe essere necessario aggiungere prima una chiave al portachiavi: ad es/usr/bin/ssh-add -K .ssh/github


2

Modificare ~ / .ssh / config per aggiungere UseKeyChain per tutti gli host è sufficiente per fermare questo incubo ricorrente;)

Host *
 UseKeychain yes

Se il file è vuoto o non esiste, crea e / o aggiungi la configurazione precedente.


1

Ho aggiornato a Mac OS X Sierra (10.12.6). Potrei scrivere su altri host ma non su github.com.

Questo è ciò che ho dovuto inserire in ~ / .ssh / config:

PubkeyAcceptedKeyTypes ssh-dss,ssh-rsa

Dopo quel cambiamento, potrei usare github come prima.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.