Иногда нужно автоматизировать работу по ssh или копирование через scp, при этом ввод пароля совершенно не уместен.
Ну, хорошо, или просто лень его вводить каждый раз ;-)
Тогда нам на помощь приходит шифрование с открытым ключом.
Кому интересно можете почитать детальнее
А я лишь опишу технические аспекты.
Нам нужно сделать две вещи:
- Сгенерировать ключи
- Установить открытый ключ на машину, к которой нужно подключаться.
Генерация ключа
Для генерации используется утилита ssh-keygen
Генерировать можно или DSA-ключи (длина ключа всегда 1024 бита) или RSA-ключи (по умолчанию длина ключа 2048 бит). На выходе в каталоге ~/.ssh/ будет два файла id_dsa и id_dsa.pub.
Вот вариант, который мне больше всего нравится:
ssh-keygen -t rsa -b 4096 -N "" |
параметр -b 4096 – меняем длину, -N с пустой строкой — отключаем запрос парольной фразы
Файл id_rsa (id_dsa) — секретный ключ (остаётся у клиента).
Файл id_rsa.pub (id_dsa.pub) — открытый ключ (раздаётся серверам, на которые хотим заходить без ввода пароля).
Установка ключа
Два способа установки открытого ключа:
- использовать специальную для этих целей утилиту ssh-copy-id:
ssh-copy-id -p 22 user@myserver |
- залить на сервер файл с отрытым ключом (.pub) вручную или используя команду безопасного копирования:
scp ~/.ssh/id_rsa.pub user@myserver:~/id_rsa.pub |
и уже на сервере добавить его содержимое в конец файла ~/.ssh/authorized_keys и удалить (более будет не нужен):
cat id_rsa.pub >> ~/.ssh/authorized_keys && rm id_rsa.pub |
при выборе DSA замените id_rsa.pub на id_dsa.pub
Проблемы
Столкнулся с тем, что после использования ssh-copy-id пароль все равно запрашивался.
Решение: в /etc/ssh/sshd_config нужно разрешить подключение по ключу: PubkeyAuthentication yes
Если SSH-сервер был переустановлен
то меняется его уникальный идентификатор, так называемый "отпечаток пальца" (fingerprint) и SSH-клиент отказывается подключаться выводя при этом грозные сообщения.
Чтобы клиент "забыл" про старый идентификатор, нужно удалить имя соответствующего узла (в нашем случае myserver) вернее всю строку из файла ~/.ssh/known_hosts, для этого отредактируйте его вручную или же просто выполните команду: