macOS Sierra wydaje się nie pamiętać kluczy SSH między restartami

181

Muszę uruchomić to polecenie od czasu aktualizacji do systemu macOS:

ssh-add -K

Rozwiązuje problem po ponownym uruchomieniu, ale muszę uruchamiać to polecenie przy każdym logowaniu do komputera.

Jeśli nie uruchomię powyższego polecenia, moje klucze ~/.sshzostaną pominięte i zostanie wyświetlone pytanie o hasło serwera w celu nawiązania połączenia.

bisherbas
źródło
1
$ ssh-add -Kdaje missh-add: illegal option -- K
mod.
1
Musisz wprowadzić ścieżkę klucza prywatnego po -K. Zobacz odpowiedź @JakeGould na rozwiązanie.
bisherbas
Aktualizacja 10.12.2 wyeliminowała dla mnie niepotrzebne żądania hasła do serwera. Być może nie będziesz już musiał uruchamiać ssh-add -K.
Wayfaring Stranger,

Odpowiedzi:

212

Począwszy od macOS Sierra 10.12.2 Apple dodało ssh_configopcję o nazwie, UseKeychainktóra pozwala na „właściwe” rozwiązanie problemu. Dodaj następujące elementy do ~/.ssh/configpliku:

Host *
   AddKeysToAgent yes
   UseKeychain yes     

Ze ssh_config manstrony 10.12.2:

Użyj Keychain

W systemie macOS określa, czy system powinien wyszukiwać hasła w pęku kluczy użytkownika podczas próby użycia określonego klucza. Gdy hasło zostanie dostarczone przez użytkownika, ta opcja określa również, czy hasło powinno być przechowywane w pęku kluczy po zweryfikowaniu, czy jest poprawne. Argumentem musi być „tak” lub „nie”. Domyślne ustawienie to „nie”.

mluisbrown
źródło
2
Zgodnie z tym linkiem: openradar.appspot.com/27348363 Apple „ zmieniło [swoje] zachowanie z głównym nurtem OpenSSH w tym obszarze”.
ThomasW
15
To absurdalne, że Apple zmodyfikowało zachowanie w sposób, który spowoduje problemy dla zdecydowanej większości programistów (z powodu push GitHub, jeśli nic więcej) i nic nie powiedział!
mluisbrown,
9
Myślę, że IdentityFile ~/.ssh/id_rsajest zbędny i nie jest potrzebny (patrząc na domyślne opcje). Nigdy nie ustawiłem tej opcji w moim pliku konfiguracyjnym ssh.
therealmarv,
9
@JakeGould Zmiana IMO ~/.ssh/config~jest lepsza, ponieważ rozwiązuje problem na sshpoziomie. Nie jestem w 100% pewien, że .bash_profilemod będzie działał dla klientów GUI korzystających z ssh bez powłoki.
mluisbrown,
6
Apple opublikowało notatkę techniczną TN2449 dotyczącą tej zmiany.
Kentzo,
106

Miałem ten problem również podczas próby wdrożenia kodu za pomocą Capistrano . Bardzo frustrujące. Oto dwie znane mi metody radzenia sobie z tym problemem.

Metoda 1: Dodaj wszystkie znane klucze do agenta SSH.

Jednym z rozwiązań, które znalazłem, jest uruchomienie ssh-addz -Aopcją - która dodaje wszystkie znane tożsamości do agenta SSH przy użyciu dowolnych haseł przechowywanych w twoim pęku kluczy - w ten sposób:

ssh-add -A

Teraz to działa, ale nie będzie trwało po ponownym uruchomieniu komputera. Jeśli więc nie chcesz się już o to martwić, po prostu otwórz ~/.bash_profileplik użytkownika w następujący sposób:

nano ~/.bash_profile

I dodaj tę linię na dole:

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

Teraz, gdy otworzysz nowe okno Terminalu, wszystko powinno być dobrze!

Metoda 2: Dodaj do agenta tylko klucze SSH znajdujące się w pęku kluczy .

Tak więc, chociaż ta ssh-add -Aopcja powinna działać w przypadku większości podstawowych przypadków, niedawno natknąłem się na problem, w którym miałem 6-7 skrzynek Vagrant (które używają kluczy SSH / tożsamości w celu uzyskania dostępu) na komputerze na bardziej powszechnym id_rsa.pubmiejscu.

Krótko mówiąc, ostatecznie zostałem zablokowany na zdalnym serwerze z powodu zbyt wielu nieudanych prób opartych na kluczach / tożsamościach SSH, ponieważ dostęp do serwera był oparty na haśle, a klucze / tożsamości SSH to klucze / tożsamości SSH. Więc agent SSH wypróbował wszystkie moje klucze SSH, nie powiodło się i nie mogłem nawet dostać się do monitu o hasło.

Problem polega na tym, ssh-add -Aże po prostu arbitralnie doda każdy klucz SSH / tożsamość, którą masz do agenta, nawet jeśli nie jest to konieczne; tak jak w przypadku pudeł Vagrant.

Moje rozwiązanie po wielu testach było następujące.

Po pierwsze, jeśli masz więcej kluczy / tożsamości SSH dodanych do agenta, niż potrzebujesz - jak pokazano za pomocą, ssh-add -lnastępnie usuń je wszystkie z agenta w następujący sposób:

ssh-add -D

Po wykonaniu tej czynności uruchom agenta SSH jako proces działający w tle:

eval "$(ssh-agent -s)"

Teraz robi się dziwnie i nie jestem pewien, dlaczego. W niektórych przypadkach możesz specjalnie dodać ~/.ssh/id_rsaklucz / tożsamość do agenta w następujący sposób:

ssh-add ~/.ssh/id_rsa

Wpisz swoje hasło, naciśnij Returni powinieneś być gotowy.

Ale w innych przypadkach wystarczy uruchomić to, aby dodać klucz / tożsamość:

ssh-add -K

Jeśli to wszystko działało, wpisz ssh-add -li powinieneś zobaczyć jeden samotny klucz / tożsamość SSH na liście.

Wszystko dobrze? Teraz otwórz swoje .bash_profile:

nano ~/.bash_profile

I dodaj tę linię na dole; skomentuj lub usuń -Awersję, jeśli ją masz:

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

Umożliwi to ponowne załadowanie klucza / tożsamości SSH do agenta SSH przy każdym uruchomieniu / ponownym uruchomieniu.

AKTUALIZACJA: Apple dodał teraz UseKeychainopcję do otwartych opcji konfiguracji SSH i rozważa ssh-add -Arównież rozwiązanie.

Począwszy od macOS Sierra 10.12.2, Apple dodało UseKeychainopcję konfiguracji dla konfiguracji SSH. Sprawdzanie strony podręcznika (przez man ssh_config) pokazuje następujące informacje:

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

Sprowadza się to do tego, że Apple widzi rozwiązanie jako albo dodanie ssh-add -Ado twojego, .bash_profile jak wyjaśniono w tym bilecie Open Radar, lub dodanie UseKeychainjako jednej z opcji na użytkownika ~/.ssh/config.

JakeGould
źródło
4
@modius: jeśli masz klucz chroniony przed pw, zrób ssh-add -K [path to key]i wpisz pw po wyświetleniu monitu. Keychain będzie przechowywać hasło, a następnie ssh-add je dostanie.
Timo,
2
Zauważ, że -A służy do dodawania tożsamości do agenta przy użyciu dowolnych haseł zapisanych w twoim pęku kluczy. Jeśli dodatkowo masz tożsamości bez haseł, musisz pominąć opcję -A, aby dodać je do swojego agenta.
Evan Pon,
12
Aby dodać do tego nieco więcej widoczności, Apple zaktualizowało stronę podręcznika, aby ssh_config zawierał UseKeychaini AddKeysToAgentautomatycznie dodawał klucze z twojego ssh_config. Nie wymaga skryptowania powłoki. Zobacz @mluisbrown odpowiedź poniżej, aby uzyskać zaktualizowane informacje na 10.12.2
Ryan Gibbons
1
@JakeGould rozumiem, co mówisz, naprawdę podoba mi się to, co robią. Zamiast automatycznie zapisywać hasło do pęku kluczy i ładować je przy starcie, dają ci kontrolę nad twoim bezpieczeństwem. / wzruszenie ramionami
Ryan Gibbons
1
@RyanGibbons FWIW, spójrz na oficjalną sugestię Relacji programistów Apple w odpowiedzi na OpenRadar: „Możesz to dość łatwo naprawić, uruchamiając ssh-add -Askrypt rc, jeśli chcesz, aby klucze były zawsze ładowane.” ¯\_(ツ)_/¯
JakeGould
16

Jak wyjaśniono tutaj , jest to zalecana metoda od macOS 10.12.2 :

  1. Dodaj następujące wiersze do ~/.ssh/configpliku:

    Host *
        UseKeychain yes
        AddKeysToAgent yes
  2. Każdy klucz dodany do ssh-agent za pomocą ssh-add /path/to/your/private/key/id_rsapolecenia zostanie automatycznie dodany do pęku kluczy i powinien zostać automatycznie załadowany po ponownym uruchomieniu.


Dodaję tę odpowiedź, ponieważ:

  • Inne odpowiedzi mówią o dodaniu IdentityFile ~/.ssh/id_rsawiersza, ale ta opcja nie jest potrzebna do automatycznego ładowania kluczy (i faktycznie wiąże ten konkretny klucz dla sekcji hosta, do której go dodajesz, czego nie będziesz chciał, jeśli użyjesz różnych kluczy do różne hot).
  • W zaakceptowanej odpowiedzi wspomniano UseKeychain, ale to nie wystarczy, aby zachować klucze ssh-agentpo ponownym uruchomieniu.
Ricardo Sanchez-Saez
źródło
1
Odnośnie drugiego punktu. Jak pewny jesteś? Po zrestartowaniu nic się tak naprawdę nie dzieje i nie jest to również wymienione w materiale referencyjnym. Z powyższą konfiguracją dzieje się tak, że klient SSH załaduje klucz do agenta przy pierwszym połączeniu (i również pobierze hasło z pęku kluczy), a następnie klucz pozostanie załadowany. Możesz zweryfikować to oświadczenie, wymieniając klucze zaraz po ponownym uruchomieniu za pośrednictwem, ssh-add -La raport zostanie zgłoszony The agent has no identities. Nic się nie pojawi, dopóki się nie połączysz. AddKeysToAgentNie utrzymują kluczy między restartów w żaden sposób!
Danila Vershinin
15

Napisałem krótki post na ten temat, który może ci pomóc.

Rozwiązaniem jest wywoływanie ssh-add -Apolecenia przy każdym uruchomieniu.

Po prostu dodaj .plistdo ścieżki plik z następującą zawartością ~/Library/LaunchAgents/lub utwórz go za pomocą aplikacji 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
źródło
8

Od macOS 10.12.2 możesz użyć tej UseKeychainopcji. Przeczytaj więcej tutaj lub zajrzyj do 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''.

Więc po prostu wykonaj następujące czynności:

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

Ben
źródło
1
Korzystanie >>jest zagrożone, jeśli wprowadzisz polecenie wiele razy. Lepiej wykonaj ręczną edycję pliku, zgodnie z opisem w odpowiedzi mluisbrown lub ChrisJF .
Cœur
Jesteś tam :-)
Ben
4

Miałem wcześniej ten problem i znalazłem sposób na obejście tego. Właśnie utworzyłem plik o nazwie configw moim ~/.sshfolderze, do którego dodałem następujące linie:

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

Nie jestem pewien dlaczego, ale Hosti HostNameobie są ważne. W moim przypadku, jeśli jeden z nich nie był obecny, rozwiązanie nie działało.

Potem zrobiłem ssh-add -Ki działało nawet po restarcie.

Nieskończoność
źródło
1
Host to twoja nazwa / alias zdefiniowany przez użytkownika dla określonego serwera i wyznacza wpisy na serwer: stylistycznie miło jest wciąć wiersze następujące po wpisie Host. Nazwa_hosta wskazuje adresowalną nazwę serwera, na przykład github.com, ale możesz również użyć adresu IP. Host i nazwa_hosta nie muszą być tym samym, ale tak, oba są integralne z formatem konfiguracji ssh.
Mark Fox
3

Odkryłem, że ssh-add -Kdało mi to „ nielegalną opcję - K ”. Stało się tak, ponieważ ssh-add była dziwną wersją pochodzącą z / usr / local / bin (zainstalowaną przez brew?). Byłem w stanie dodać klucz poprzez specyficzne użycie ssh-add znajdującego się w / usr / bin:

/usr/bin/ssh-add -K ~/.ssh/id_rsa
Fiskabollen
źródło
3

Jeśli używasz innej wersji ssh (np. Instalowanej przez homebrew), powyższe rozwiązania nie będą działać od razu po wyjęciu z pudełka. Na przykład, AddKeysToAgent yesa UseKeychain yesw .ssh/configpliku nie są rozpoznawane przez wersjach innych niż Apple SSH i spowoduje błąd. To samo dotyczy opcji -Alub -Kdla sshklienta.

Oznacza to , że odpowiedź @mluisbrown w ogóle nie zadziała. Możesz użyć metody 1 z odpowiedzi @JakeGould i jawnie użyć ssh-addnarzędzia macOS w swoim, .bash_profileaby dodać wszystkie klucze do pęku kluczy, tj .:

/usr/bin/ssh-add -A

Jak wspomniano w komentarzu powyżej , może być konieczne dodanie klucza do pęku kluczy: np/usr/bin/ssh-add -K .ssh/github

n1000
źródło
2

Wystarczy zmienić ~ / .ssh / config, aby dodać UseKeyChain dla wszystkich hostów, aby zatrzymać ten powtarzający się koszmar;)

Host *
 UseKeychain yes

Jeśli plik jest pusty lub nie istnieje, utwórz i / lub dodaj powyższą konfigurację.

chim
źródło
1

Zaktualizowałem system do Mac OS X Sierra (10.12.6). Mógłbym ssh na innych hostach, ale nie na github.com.

Oto, co musiałem wstawić do ~ / .ssh / config:

PubkeyAcceptedKeyTypes ssh-dss,ssh-rsa

Po tej zmianie mogłem używać github jak poprzednio.

Matthias Bohlen
źródło