man/man/SSH-key-auth-win.md

7.0 KiB

SSH авторизация по ключам

В интернете можно найти множество иснтрукций о том как настроить ssh авторизацию по ключам для использования с репозиториями, удаленным администрированием, различными программами контроля версий и т.д. Встречаются даже такие извращения как использование Putty агента в связке с Tortoise Git на основе Putty сессий. Варианты с генерацией ключа с помощью Putty, конвертирование из одного формата в другой и подсовывание в Tortoise Git я, изрядно измучившись, тоже выкинул. Даже на самом GitHub лежит мануал с использованием агента ключей.

Перелопатив кучу мануалов я решил что мне нужен универсальный способ. И похоже мне удалось такой найти.

Итак, мне нужно чтобы работало:

  • из любых терминалов (cmd, PowerShell, Git-bash, Git-cmd)
  • с любыми shell (cmd, sh, bash, zsh т.д.)
  • c любыми встроенными в терминалы или shell утилитами (ssh, scp, sftp и т.д.)
  • со всеми репозиториями (GitHub, GitLab, Gitea)
  • с различными GUI (TortoiseGit, VSCode, Altium Designer и пр.)
  • без использования агентов ключей (ssh-agent или Putty)
  • одинаково настраивалось как в Windows, так и в Linux.
  • на одну машину должен приходиться один ключ, чтобы не настраивать отдельно для каждой утилиты/приложения/IDE
  • один ключ для работы с репозиториями и доступом к удаленным серверам

Как оказалось чтобы все это реализовать нужно было не гуглить мануалы, а читать man ssh.


Для работы с SSH в windows будем использовать OpenSSH. Ставить отдельно его не надо т.к. OpenSSH идет в комплекте с Git. Ставим его в первую очередь.

Если же Git уже установлен, то идем дальше...


1. Открываем терминал и создаем ключ нашей локальной системы.

$ ssh-keygen -t rsa

На все вопросы нажимаем "Enter", отказываясь от ключевой фразы.

Как результат в домашней папке пользователя будет создана ключевая пара:

  • .ssh/id_rsa (закрытый ключ)
  • .ssh/id_rsa.pub (открытый ключ)

Закрытый ключ мы не трогаем. Он секретный и остается только на этой машние. Открытый ключ мы используем для помещения в репозитории и удаленные сервера.


2. Добавляем ключ в ~/.ssh/config

Поскольку мы не будем пользоваться никакими агентами ключей, то для пользования репозиториями, нужно прописать данный ключ в ~/.ssh/config в качестве ипользуемого по умолчанию глобально.

Если этого файла нет, то создаем его и добавляем в него строчку:

IdentityFile ~/.ssh/id_rsa

~/.ssh/config вообще очень полезный файл. Рекомендую почитать что он еще умеет. Например туда можно прописать хосты типа:

Host site
  HostName www.my-site.dyndns.org
  Port 2222
  User user

Тогда вместо такого:

$ ssh user@www.my-site.dyndns.org -p 2222

Можно писать так:

$ ssh site

3. Добавляем ключ на удаленные сервера Linux

Если ключ нужен только для работы с репозиториями, то переходим к следующему пункту.

Если есть программа ssh-copy-id (в Linux и Git-bash она есть), прописываем публичный ключ на удаленный сервер.

$ ssh-copy-id -i ~/.ssh/id_rsa.pub user@server_ip

Eсли ssh-copy-id нет, то можно сделать это вручную.

Вот последовательность действий:

  • логинимся на удаленной машине
  • добавляем свой ключ в файл authorized_keys
remote$ echo "содержимое файла открытого ключа" >> ~/.ssh/authorized_keys
  • делаем правильные права (если файл только что был создан)
remote$ chmod 600 ~/.ssh/authorized_keys
  • проверяем, что все работает, запускаем на локальном компьютере.
$ ssh user@server_ip

4. Добавляем ключ в репозитории

Для работы с репозиториями необходимо прописать туда публичный ключ. Для этого копируем содержимое файла ~/.ssh/id_rsa.pub во все необходимые репозитории.

  • GitHub: Settings -> SSH and GPG keys -> Nes SSH key
  • GitLab: Preferences -> SSH Keys -> Add key
  • Gitea: Settings -> SSH / GPG keys -> Add Key

В качестве имени ключа удобно указывать пользователя и имя машины.

user@host

Для тестирования авторизации можно запустить:

$ ssh -T git@github.com

Аналогично и для других репозиториев:

$ ssh -T git@repo_url

Что проверяю я:

$ ssh -T git@github.com
$ ssh -T git@git.fwdrd.ru
$ ssh -T git@gitlab.srv.mf-t.ru -p 2222

5. Настройка TortoiseGit

Чтобы TortiseGit переключился на использование OpenSSH надо в настройках

Settings -> Network -> SSH client

поменять клиент на

C:\Program Files\Git\usr\bin\ssh.exe

PS (Linux)

Если все настроено но все равно спрашивает пароль, то надо проверить права:

chmod 755 ~
chmod 700 ~/.ssh
chmod 600 ~/.ssh/*

Удачной работы!