Come usare Portachiavi Mac OS X con chiavi SSH?


141

Capisco che da Mac OS X Leopard il Keychain ha supportato la memorizzazione delle chiavi SSH. Qualcuno potrebbe spiegare come dovrebbe funzionare questa funzione.

Ho alcune chiavi RSA che ho generato archiviate nella mia directory ~ / .ssh per accedere a vari server. Non ho passphrase su quelle chiavi. Attualmente per accedere a quei server uso i seguenti comandi nel Terminale:

eval `ssh-agent`
ssh-add ~ / .ssh / some_key_rsa
ssh user @ server

(Ho scritto alcune funzioni di Bash per renderlo più semplice.)

C'è un modo migliore per farlo usando il portachiavi?

Risposte:


16

Affinché funzioni, è $SSH_AUTH_SOCKnecessario indicare la variabile di ambiente /tmp/launch-xxxxxx/Listeners. Questo dovrebbe essere fatto automaticamente quando accedi. L'ascoltatore su quel socket parla il protocollo ssh-agent.

I tuoi script bash stanno avviando il tuo agente ssh (scritto ssh-agent, non ssh_agent) e sovrascrivendo quello esistente ssh-agentche è impostato per te al login.

Inoltre, il punto chiave del portachiavi è archiviare le password nelle chiavi ssh, ma dici che non hai passphrase su quelle chiavi, quindi non sono sicuro di cosa ti aspetti dall'integrazione del portachiavi.

Alla fine, al primo accesso, probabilmente non vedrai un processo ssh-agent. Tale processo verrà avviato automaticamente dai servizi di avvio la prima volta che qualcosa tenta di leggere quel socket /tmp.


1
Grazie. Quindi dovrò ancora eseguire ssh-addper aggiungere le mie identità RSA all'agente ssh predefinito avviato all'accesso?
John Topley,

Non è necessario eseguire ssh-add; ssh-agent richiederà la passphrase della chiave la prima volta che si esegue ssh.
Rudedog,

3
Mi richiede la password ogni volta che eseguo ssh. Il punto è che non voglio inserire alcuna password.
John Topley,

1
Cosa ti chiede la password? Sto cominciando a sospettare che sia il server remoto che ti sta spingendo, il che mette la tua dichiarazione che le tue chiavi non hanno passphrase in una prospettiva migliore. Se si desidera ignorare la password sul server remoto, è necessario aggiungere la chiave pubblica $HOME/.ssh/authorized_keyssu quel server. Il portachiavi ssh-agent + di Mac OS viene utilizzato solo per memorizzare la passphrase per le chiavi ssh locali; non ha lo scopo di inviare password remote su connessioni ssh esistenti.
Rudedog,

1
utilizzare ssh -vper diagnosticare ciò che sta facendo ssh. utilizzare anche sshd -p 8900 -vsul lato server e ssh -v remote:8900per diagnosticare cosa sta facendo sshd.
Rudedog,

252

A partire dalla versione Leopard di OS X, ssh-agent è più strettamente integrato con Keychain. È possibile archiviare le passphrase di tutte le chiavi SSH in modo sicuro nel Portachiavi, da cui ssh-agent le leggerà all'avvio. La linea di fondo è che è semplice proteggere le tue chiavi con passphrase, ma non devi mai digitare la passphrase per usarle! Ecco come:

Aggiungi la passphrase a ciascuna chiave ssh al portachiavi: (l'opzione -k carica solo semplici chiavi private, salta i certificati)

ssh-add -K [path/to/private SSH key]

(nota che è una K maiuscola)

Ogni volta che riavvii il Mac, tutte le chiavi SSH nel tuo portachiavi verranno caricate automaticamente. Dovresti essere in grado di vedere le chiavi nell'app Accesso Portachiavi, nonché dalla riga di comando tramite:

ssh-add -l

ssh-add -lnon elenca alcun tasto durante la connessione in remoto (dove $ DISPLAY non è impostato). Trucchi speciali devono essere impiegati qui per utilizzare il portachiavi (ad esempio in superuser.com/questions/141044/… )
Ether

2
developer.apple.com/library/mac/documentation/Darwin/Reference/… È inoltre necessaria l'opzione -K per memorizzare le passphrase nel portachiavi.
Neeme Praks,

5
Se hai installato un'altra versione di SSH attraverso un sistema di pacchetti come Homebrew, è necessario utilizzare un percorso assoluto come /usr/bin/ssh-add.
Ludovic Kuty,

1
È interessante notare che nel mio macOS Sierra non richiede la password dopo il riavvio ma ssh-add -lrestituisce "L'agente non ha identità". ( ps auxinclude /usr/bin/ssh-agent -l).
Halil Özgür,

4
Per macOS Sierra, le cose sono cambiate. Visita github.com/jirsbek/SSH-keys-in-macOS-Sierra-keychain
schieferstapel il

80

A partire da macOS Sierra , ssh-agent non carica più automaticamente le chiavi ssh precedentemente caricate quando accedi al tuo account. Questo è intenzionale da parte di Apple, volevano riallineare con l' implementazione mainstream di OpenSSH . [1]


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.


Quanto segue è obsoleto (conservato come riferimento).

Per tornare al comportamento precedente, ti consigliamo di eseguire il ssh-add -Acomando (che carica automaticamente tutte le chiavi ssh che hanno passphrase sul tuo portachiavi) quando esegui l'accesso. Per farlo, segui questi passaggi:

  1. Per prima cosa, aggiungi tutte le chiavi che vuoi caricare automaticamente su ssh-agent usando il ssh-add -K /absolute/path/to/your/private/key/id_rsacomando. L' -Kargomento assicura che la frase chiave venga aggiunta al portachiavi di macOS . Assicurati di utilizzare il percorso assoluto della chiave. L'uso di un percorso relativo farà sì che lo script avviato automaticamente non trovi la chiave.

  2. Assicurati che tutte le chiavi siano visualizzate come aggiunte durante la digitazione ssh-add -A.

  3. Creare un file chiamato com.yourusername.ssh-add.plistin ~/Library/LaunchAgents/con i contenuti che seguono. I file Plist come questo sono usati launchdper eseguire gli script quando esegui l'accesso. [2] [3]

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
    <key>Label</key>
      <string>com.user.loginscript</string>
    <key>ProgramArguments</key>
      <array>
        <string>ssh-add</string>
        <string>-A</string>
      </array>
    <key>RunAtLoad</key>
      <true/>
    </dict>
    </plist>
    
  4. Dillo launchdper caricare il file di plist appena creato eseguendo: launchctl load ~/Library/LaunchAgents/com.yourusername.ssh-add.plist.

E dovresti essere pronto.



33

Esiste un modo più semplice della risposta di Ricardo per mantenere la password tra le sessioni / i riavvi del Mac con 10.12 Sierra.

  1. ssh-add -K ~/.ssh/id_rsa
    Nota: modifica il percorso in cui si trova la tua chiave id_rsa.
  2. ssh-add -A
  3. Crea (o modifica se esiste) il seguente ~/.ssh/configfile:

    Host *
      UseKeychain yes
      AddKeysToAgent yes
      IdentityFile ~/.ssh/id_rsa
    

    Ora la password viene ricordata tra i riavvii!

Apple ha volutamente modificato il comportamento di ssh-agent in macOS 10.12 Sierra per non caricare più automaticamente le chiavi SSH precedenti, come indicato in questa OpenRadar , nella discussione su Twitter e nella Nota tecnica di Apple . La soluzione sopra imiterà il vecchio comportamento di El Capitan e ricorderà la tua password.


2
Fantastico, funziona come un incanto, imho molto più pulito degli altri e risolto nel posto giusto :)
GerardJP


10

Nota: per macOS Sierra, fare riferimento alla risposta più recente di ChrisJF .

La [risposta di Jeff McCarrell] [2] è corretta, tranne per il fatto che il comando per aggiungere la passphrase contiene un trattino invece di un trattino, ovvero –Kinvece di -Kcausare un messaggio a effetto di –K: No such file or directory. Dovrebbe leggere:

ssh-add -K [path/to/private SSH key]

2
Questo dovrebbe essere un commento alla risposta a cui ti riferisci piuttosto che una nuova risposta. Stiamo parlando di sicurezza qui. Si potrebbe suggerire che dovresti ssh-add -K
scriverlo

1
Usando un trattino con K, ottengo illegal option -- K. K minuscola è elencato come opzione.
Sam Dutton,

Grazie per il feedback. Ho appena controllato macOS Sierra: -Kvale a dire dash-capital-K, è ancora valido
simonair

6

Ho il sospetto che non stai usando il sshcomando predefinito . Hai sshinstallato tramite porte? Prova which ssha vedere quale sshcomando stai usando.

Di solito dovrebbe visualizzare una finestra di dialogo che richiede la password, se non è già memorizzata nel portachiavi.


Non sto usando le porte.
John Topley,

Grazie per le informazioni :) Ho avuto problemi perché stavo usando OpenSSH da Homebrew.
ggustafsson,

6

Ho avuto un problema simile mentre provavo ad accedere usando un client ssh cert. In questo caso specifico era per accedere a un repository git. Questa era la situazione:

  • La chiave è stata salvata ~/.ssh/
  • La chiave privata ha una passphrase.
  • La passphrase è memorizzata nel portachiavi di login di OS X. ~/Library/Keychains/login.keychain
  • La connessione era la seguente: il mio mac mac ->remoto ->server git / ssh
  • Mac OS X 10.8.5

Quando mi sono connesso al Mac remoto usando il desktop remoto, non ho avuto problemi. Tuttavia, quando mi collegavo con SSH al mac remoto, mi veniva chiesto ogni volta la passphrase ssh. I seguenti passaggi lo hanno risolto per me.

  1. security unlock-keychainLa passphrase è memorizzata nel portachiavi di accesso. Questo lo sblocca e consente a ssh-agent di accedervi.
  2. eval `ssh-agent -s`Avvia ssh-agent per l'uso della shell. Otterrà la passphrase dal portachiavi e lo userà per sbloccare la chiave ssh privata.
  3. Stabilire la connessione ssh / git e fare il mio lavoro.
  4. eval `ssh-agent -k` Uccidi l'agente ssh in esecuzione.
  5. security lock-keychain Blocca di nuovo il portachiavi.

1
Per far funzionare # 2 per me all'interno di un alias, ho dovuto usare eval \$(ssh-agent)per Re: accesso remoto e portachiavi . Quando non all'interno di un alias eval $(ssh-agent)funziona ( senza la barra rovesciata $ ).
Travis,

4

Guarda anche:

security import priv_key.p12 -k ~/Library/Keychains/login.keychain
security import pub_key.pem -k ~/Library/Keychains/login.keychain

... aggiungendo questa nota quando sono stati richiesti ulteriori dettagli: il comando "security" è in grado di importare chiavi (e altre cose) direttamente in Keychain. La cosa bella è che a differenza di ssh-add, sei in grado di specificare il portachiavi. Ciò consente di importare direttamente nel Keychain di sistema ("man security" per sapere come)


1
Potresti dare qualche dettaglio in più a questa risposta, per favore? Grazie.
Matthew Williams,

1

La soluzione migliore e prevista da Apple (da macOS 10.12.2) è descritta qui

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 ChrisJF .
Cœur il

Sì, proprio lì
Ben
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.