Как скопировать SSH-ключ на Mac и сгенерировать новый
Чтобы скопировать публичный SSH-ключ в буфер обмена, выполните в Терминале:
pbcopy < ~/.ssh/id_ed25519.pub
Команда ничего не выводит. Ключ уже в буфере: вставьте его через Cmd+V в GitHub, GitLab или панель хостинга.
Если ключ создан по версии этого поста 2017 года или командой ssh-keygen без параметров до OpenSSH 9.5 (2023 год), он RSA и лежит в другом файле:
pbcopy < ~/.ssh/id_rsa.pub
Если zsh отвечает no such file or directory, такого ключа у вас нет. Создайте его (ниже).
Я проверил команды на OpenSSH 10 (в macOS 26.1 стоит 10.0p2) с сервером на Ubuntu 26.04.
Какой файл копировать: публичный ключ
ls ~/.ssh
Ключ — это пара файлов. id_ed25519 — закрытый ключ, он не покидает ваш Mac. id_ed25519.pub — публичный, его можно отдавать кому угодно. Это одна строка:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... you@example.com
Если текст в буфере начинается с -----BEGIN OPENSSH PRIVATE KEY-----, а у старых RSA-ключей — с -----BEGIN RSA PRIVATE KEY-----, вы скопировали закрытый ключ. Никуда его не вставляйте.
Без pbcopy: выполните cat ~/.ssh/id_ed25519.pub, выделите строку от ssh- до конца и нажмите Cmd+C.
Как создать SSH-ключ на Mac
ssh-keygen -t ed25519 -C "you@example.com"
На вопрос о файле нажмите Enter: ключ ляжет в ~/.ssh/id_ed25519. Потом дважды введите парольную фразу (о ней ниже). Если папки ~/.ssh нет, ssh-keygen создаст её с правами 700, а закрытому ключу поставит 600. Остаётся скопировать ключ через pbcopy.
-C — комментарий в конце ключа. По нему вы отличите ключи в authorized_keys на сервере и в выводе ssh-add -l. Без -C комментарием станет user@hostname.
С OpenSSH 9.5 ssh-keygen без параметров тоже создаёт Ed25519. Я всё равно пишу -t ed25519, чтобы на старых системах получился такой же ключ.
Если ssh-keygen пишет id_ed25519 already exists и спрашивает Overwrite (y/n)?, отвечайте n. Перезапись удалит старый ключ, и все серверы, где он был, перестанут вас пускать.
Парольная фраза и Связка ключей macOS
Парольная фраза шифрует закрытый ключ: без неё украденный файл бесполезен. Чтобы не вводить фразу при каждом подключении, сохраните её в Связке ключей:
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
И добавьте в ~/.ssh/config (если файла нет, создайте его):
Host *
AddKeysToAgent yes
UseKeychain yes
С UseKeychain ssh берёт парольную фразу из Связки ключей, а если вы ввели её вручную и она подошла, сохраняет туда. AddKeysToAgent загружает ключ в ssh-agent при первом подключении. После перезагрузки запускать ssh-add заново не нужно.
В старых инструкциях встречается ssh-add -K. В macOS 26.1 он ещё работает, но выводит предупреждение, а в man сказано, что следующие версии macOS перестанут его поддерживать.
Проверить парольную фразу: ssh-keygen -y -f ~/.ssh/id_ed25519. С верной фразой команда выведет публичный ключ, с неверной — incorrect passphrase supplied to decrypt private key. Та же команда восстановит удалённый .pub:
ssh-keygen -y -f ~/.ssh/id_ed25519 > ~/.ssh/id_ed25519.pub
Поставить или сменить парольную фразу: ssh-keygen -p -f ~/.ssh/id_ed25519.
Если ~/.ssh/config общий с Linux-машинами, ssh там остановится с ошибкой Bad configuration option: usekeychain. Первой строкой файла напишите:
IgnoreUnknown UseKeychain
RSA-ключ для старых серверов
Ed25519 появился в OpenSSH 6.5 в январе 2014 года. Если старый сервер не принимает ваш ключ, создайте RSA:
ssh-keygen -t rsa -b 4096 -C "you@example.com"
Он сохранится в ~/.ssh/id_rsa. Без -b длина будет 3072 бита. RSA-ключ, который у вас уже есть, работает с современными серверами, менять его не обязательно.
Со старым сервером одного ключа мало. Серверы до OpenSSH 7.2 (2016 год) принимают RSA-ключ только с подписью SHA-1 (ssh-rsa), а ssh с версии 8.8 (2021 год) по умолчанию так не подписывает. ssh тогда пропускает ключ: просит пароль или отвечает Permission denied (publickey). Причину видно только в ssh -v: no mutual signature algorithm. Разрешите SHA-1 для одного этого сервера в ~/.ssh/config. Вместо адреса из примера напишите тот, что набираете после @:
Host oldserver.example.com
PubkeyAcceptedAlgorithms +ssh-rsa
HostKeyAlgorithms +ssh-rsa
HostKeyAlgorithms нужен, если у сервера только RSA-ключ хоста. Без этой строки ssh остановится ещё до входа с ошибкой no matching host key type found. Their offer: ssh-rsa. ssh-copy-id тоже читает эти настройки. Не пишите их под Host *: OpenSSH отключил SHA-1, потому что атаки на коллизии стали осуществимы на практике.
Как скопировать ключ на сервер: ssh-copy-id
ssh-copy-id в macOS уже есть:
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server
Он один раз входит на сервер, обычно по паролю, и дописывает ключ в ~/.ssh/authorized_keys. Папку и файл создаёт сам, с правами 700 и 600. Если всё прошло, увидите Number of key(s) added: 1.
Не убирайте -i. Без него ssh-copy-id возьмёт ключи из ssh-agent или самый свежий ~/.ssh/id*.pub, а это может оказаться не тот ключ.
Для ssh-copy-id нужен любой рабочий вход: пароль или другой ключ, который сервер уже принимает. Если нет ни того, ни другого, временно включите пароли или добавьте ключ на самом сервере (ниже).
Как добавить ключ в authorized_keys вручную
То же без ssh-copy-id, одной строкой с Mac:
cat ~/.ssh/id_ed25519.pub | ssh user@server 'mkdir -p ~/.ssh && chmod 700 ~/.ssh && { echo; cat; } >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys'
Если по SSH не пускает совсем, откройте терминал сервера другим способом, например через веб-консоль хостинга. Войдите под тем пользователем, под которым будете подключаться, и добавьте ключ, подставив свой вместо примера:
mkdir -p ~/.ssh
echo >> ~/.ssh/authorized_keys
echo 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... you@example.com' >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
Дописывайте через >>: одинарная > перезапишет файл и сотрёт остальные ключи. Пустой echo добавляет перенос строки: если в конце файла его нет, новый ключ приклеится к последней строке и не заработает. Пустые строки sshd пропускает.
Как добавить ключ другому пользователю через sudo, я разобрал в посте про создание администратора.
Как добавить SSH-ключ в GitHub
- Скопируйте ключ:
pbcopy < ~/.ssh/id_ed25519.pub. - В GitHub: аватар → Settings → SSH and GPG keys → New SSH key.
- В Title напишите имя своего Mac, в Key type оставьте Authentication. Вставьте ключ в поле Key и нажмите Add SSH key.
Через GitHub CLI это одна команда:
gh ssh-key add ~/.ssh/id_ed25519.pub --title "MacBook Air"
Если gh просит права admin:public_key, выполните gh auth refresh -h github.com -s admin:public_key и повторите команду.
Проверьте подключение:
ssh -T git@github.com
При первом подключении ssh покажет отпечаток ключа GitHub. Если это SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU, введите yes. Ответ Hi username! You've successfully authenticated значит, что всё работает. Permission denied (publickey) значит, что GitHub не знает этот ключ.
Если git push всё ещё спрашивает логин или токен, у репозитория адрес по HTTPS. Переключите его на SSH:
git remote set-url origin git@github.com:user/repo.git
Как создать репозиторий и сделать первый push — в посте про настройку Git.
Частые ошибки
zsh: no such file or directory: /Users/you/.ssh/id_ed25519.pub— ключа с таким именем нет. Посмотрите, что лежит в~/.ssh: если тамid_rsa.pub, копируйте его, если пусто — создайте ключ.Permissions 0644 for '/Users/you/.ssh/id_ed25519' are too openиThis private key will be ignored— закрытый ключ могут читать другие пользователи, и ssh от него отказывается. Выполнитеchmod 700 ~/.sshиchmod 600 ~/.ssh/id_ed25519.Permission denied (publickey)от сервера — ключа нет вauthorized_keysэтого пользователя или sshd игнорирует файл. Если у~/.sshилиauthorized_keysесть права на запись для всех (777, 666), в логе sshd появитсяAuthentication refused: bad ownership or modes. Какие ключи предлагает ваш Mac, покажетssh -v user@server.- Парольную фразу спрашивают при каждом подключении — настройте Связку ключей (раздел выше).