Доступ к bitbucket и github по ssh ключам

Если попытка склонировать любой приватный репозиторий с bitbucket или github по ssh вызывает ошибку вида:

Permission denied (publickey).
fatal: The remote end hung up unexpectedly

То это значит, что вы не прошли авторизацию по ssh-ключам. Тут 2 варианта:

  1. Клонировать через https схему, при этом будет запрошен имя пользователя и пароль от аккаунта. Минус тот, что при любом обращении к центральному серверу (пр. git fetchgit pull) придётся снова вводить пароль.
  2. Настроить ssh-ключи, чтобы git-аутентификация проходила автоматически без ввода паролей и т.д.

Рассмотрим подробнее как настроить ssh-ключи на linux (ubuntu) и добавить их на github и bitbucket.

Генерация ssh-ключей.

Для генерации ssh-ключа выполняем следующие команды:

cd ~/.ssh
ssh-keygen -t rsa

После этого будет предложено ввести имя файла с ключами, либо если имя файла не указать, ключи будут созданы в файле id_rsa. Задаём имя файла с ключами, например, как "git_rsa". Таким образом мы будем знать, что этот ssh-ключ используется конкретно для git-авторизации. Хотя, никто не запрещает использовать один и тот же ключ id_rsa. Ключи будут храниться в домашней директории пользователя ~/.ssh/git_rsa и ~/.ssh/git_rsa.pub.

На запрос о установке пароля на связку ключей можно нажать enter, т.е. оставить пароль пустым (это безопасно). Теперь в каталоге ~/.ssh появились 2 файла ключа:

  • git_rsa — приватный, который нельзя никому сообщать
  • git_rsa.pub — публичный, который мы сообщим gitbucket и github

По умолчанию при подключении к серверу для ssh-авторизации используется ключ с именем id_rsa. Мы это обойдём. Чтобы не указывать имя нужного нам ключа (git_rsa) при каждом подключении к серверу, отредактируйте файл  ~/.ssh/config (если файла ещё нет, создайте), добавьте содержимое для идентификации bitbucket-хоста и github:

Host bitbucket.org
 IdentityFile ~/.ssh/git_rsa

Host github.com
 IdentityFile ~/.ssh/git_rsa

Всё, на нашем комьютере или сервере (смотря где создавали ключи) нужные ключи созданы. Остаётся сообщить (добавить) наш публичный ключ туда, где мы будем проходить авторизацию, т.е. на github и bitbucket.

Добавление ssh-ключа на github

В своём профиле нажимаем Edit Profile -> SSH Keys -> Add SSH key.

В свежем интерфейсе github:

  1. кликаем на иконку профиля в правом верхнем углу, далее 
  2. выбираем меню Settings
  3. в меню слева выбираем SSH and GPG keys
  4. Жмем кнопку New SSH key.

GitHub добавление нового ssh-ключа для доступа к репозиториям без ввода пароля

В форме добавления ключа указываем title (это название ключа, вводится для удобства, не на что не влияет) и key (это сам ключ, т.е. вставляем сюда всё содержимое файла ~/.ssh/git_rsa.pub). Нажимаем Add key.

Добавление ssh-ключа на bitbucket

Авторизуемся, заходим в свой аккаунт. Нажимаем SSH keys -> Add Key.  После ввода ключа в попап окошке нажимаем кнопку Add key для сохранения ssh-ключа. 

bitbucket создание ssh-ключа

bitbucket добавление ssh-ключа

Теперь вы можете клонировать свои приватные репозитории по ssh (git@github) без ввода пароля.


На что стоит обратить внимание если ssh-авторизация по ключу все еще не работает:

 
Поисковые запросы, по которым приходили пользователи
 
 
 
 

icon Комментарии 5

 Andres 2 года назад
Спасибо, Бро!
 Amati2007 3 недели назад
Добрый день!

Мне вообще уже этот "Permission denied (publickey)." всю печёнку выел!
Суть такова: есть боевой проект на jino.ru, есть репо на bitbucket-е, есть локальная версия. Сгенерил путтигеном ключи. Публичный положил на сервер в папку .ssh и добавил ключ к аккаунту на битбаккете. У себя на ПК в путти-агенте активировал приватный ключ - все должно заработать, ан нет! В путти пытаюсь запулить или запушить изменения в связке бой-битбакет - постоянно такая шняга вылезает:

"Warning: Permanently added the RSA host key for IP address '2406:da..............e9:9f55' to the list of known hosts.
Permission denied (publickey)."

да, на бою в папке .ssh после первого запуска пула или пуша в путти был такой запрос:

"
The authenticity of host 'bitbucket.org (2406:da0..............2c0:3470)' can't be established.
RSA key fingerprint is SHA256:zzX....................................YXaGp1A.
RSA key fingerprint is MD5:97:8c:1...........................aa:46:46:74:7c:40.
Are you sure you want to continue connecting (yes/no)?
"
как я понял, что-то в стиле "подлинность битбакета не установлена, хотите ли продолжить?". Я ответил согласием, после чего создался успешно файл known_hosts (на бою в папке с ключами), куда пишется ip битбаккета (как я понимаю) и дублируется строка из ключа доступа в том виде ,в котором лежит на битбакете. На др ресурсах вычитал, что чтобы Warning не выскакивал, нужно на бю в папке с ключами положить файл config без расширения и с содержимым "UserKnownHostsFile ~/.ssh/known_hosts" - сделано. Права доступа на файл ключа на бою - 600, на остальные 2 файла (конфиг и хостс) - 644, на всю папку .ssh - 700...

Что еще нужно, чтобы пул/пуш заработал по ssh??? Я уже в депрессии полнейшей!)) Может для доступа к самому репо на битбакете отдельные ключи нужно добавлять? Типа, к аккаунту на битбаккете подключается, а к репе уже нет?

SOS!!!

Спасибо!))
 root 2 недели назад
Amati2007, с виду вы все делаете верно!
на битбакет публичный ключ достаточно добавить только в аккаунт. Можно и отдельно в каждый репозиторий добавлять ключ, но не обязательно.

Права все ок.

Вот еще вы пишете, что в бою при запушить возникает ошибка "Permission denied (publickey)".
1) А как вы на боевой сервер подключаетесь? Вводите пароль или авторизуетесь по тому же самому ssh ключу? Если вводите пароль, то попробуйте для начала проверить ssh-авторизацию на хостинг по тому же ключу.
2) У вас одна единственная пара ключей создана и называется id_rsa по дефолту? Чтобы убедиться что один и тот же ключ используется для коннекта, тот же что на битбакет прописан.
3) а в ~/.ssh/config нет ничего лишнего? Указания на какой-то левый ключ? Для чистоты эксперимента удалить файл)
4) known_hosts удалить для чистоты эксперимента, он должен сам создаваться при первом подключении (хотя возможно еще зависит от ssh-клиента).

Вообще, судя по ошибке, не нравится именно ключ: проверить что на битбакет залит нужный ключ. Может, стоит сгенерить новый ключ и проверить заново (старый удалить).
 Amati2007 2 недели назад
root, спасибо, что пытаетесь мне помочь!
1) На боевой я положил публичный ключ и назвал его authorized_keys согласно п.4 инструкции по добавлению на сервер ключей ssh от хостера (https://jino.ru/help/faq/ssh/ssh-key-auth/). То есть ,если этого ключа на боевом сервере нет, то при запуске путти просит указать и логин и пароль. Если же этот ключ там лежит, то путти просит ввести логин, а затем выдает строку Authenticating with public key "rsa-key-20201109" from agent, из которой можно понять, что авторизация по ключам с сервером успешна.
2) Да, я проводил чистый эксперимент - удалил все ключи с пк, с сервера и с битбаккета, перегенерировал их через puttygen и вновь все разложил (сохраненный публичный положил на боевой под названием файла authorized_keys, строку из самого путтигена - на битбакет (название файла ключа там необязательное поле, но я ввел такое же ,как на боевом), приватный подключил в puttyagent).
 Amati2007 2 недели назад
3) В config только строка UserKnownHostsFile ~/.ssh/known_hosts и все. Изначально этого файла не было и без него всегда выдает Warning..., если соединяюсь по ssh. С ним... с ним warning выдавать не должно, но выдает все равно, правда не всегда - если в путти сделать 4 раза подряд сделать попытку пуш или пулл, то этого сообщения нет. Оно появляется с 5-ой и далее попытки. И да, я еще приметил, что в тексте сообщения этого warning вторая часть (после ::) значения IP всегда разное. Например:
5-я попытка -> 2406:da00:ff00::6b17:d1f5
6-я попытка -> 2406:da00:ff00::22c2:513
7-я попытка -> 2406:da00:ff00::22c0:3470

и т.д.
То есть складывается такое ощущение, что у битбакета динамический IP, хотя, по-идее, для таких подключений должен быть набор статичных. Они даже их список где-то публиковали...
4) Да, если я удаляю known_hosts, то при попытке пула / пуша в путти вначале идет запрос про ключи The authenticity of host '... (полный текст я приводил в основном сообщении), а когда я отвечаю на него Yes, то known_hosts на сервере создается заново.

Ремарка: если пробовать работать с репо не по ssh, а по https, то происходит следующее: при заходе в путти по логин/паролю все успешно, при попытке пулл/пуш просит пароль - я его ввожу тот, что от аккаунта битбакета и, вуаля, меня не пускает... все тот же "Доступ запрещен", хотя локальная связка работает и я могу как принимать файлы с битбакета на локал, так и отправлять изменения обратно.
Ваш комментарий к статье.. (для авторизованных)

ctrl+enter

icon Вход в систему

зарегистрироваться
НОВЫЕ ПОЛЬЗОВАТЕЛИ