# 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@git.arnik.ru $ ssh -T git@gitea.srv.mf-t.ru -p 1022 $ 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/* ``` Удачной работы!