Где и как изготавливаются ключи для сервера при ассиметричном шифровании?

О том, как настроить соединение с VPS с использованием SSH ключей, материалов довольно много (пример качественной статьи). Если кратко, то с помощью утилиты ssh-keygen нужно сгенерировать пару ключей (открытый и закрытый), затем загрузить открытый на VPS тем или иным способом.

Согласно объяснению из этого видео,

Мы передаём, как обычно, пакеты данных по незащищённому каналу, коим является интернет-соединение. Каждый пакет мы шифруем открытым ключом, а дешифровка осуществляется с помощью закрытого ключа. Открытый ключ на то открытый, что не страшно, что если его кто-то заполучит. Он может шифровать сообщения, а дешифровать - нет.

Каждый участник соединения создаёт пару "открытый и закрытый ключ" и после этого оба обмениваются своими открытыми ключами.

Первый непонятный с точки зрения логики момент - зачем иметь по одному экземпляру публичного ключа на локальной машине и VPS, если было сказано про обмен ключами? Получается, что и клиент, и сервер, шифруют пакеты данным одним и тем же публичным ключом?

Но самое главное: а где у нас в инструкциях сказано про создание пары ключей для сервера? Мы создаём ключи на локальном компьютере и загружаем публичный на сервер, следовательно ответы от сервера можно дешифровать. А вот как сервер будет дешифровать сообщения от клиента без приватного ключа?

Поскольку не может быть такого, что данные отправляются на сервер в открытом виде, то остаётся сделать вывод, что у VPS приватный ключ имелся изначально. Но соответствует ли он тому публичному ключу, что мы создали ранее?


Ответы (1 шт):

Автор решения: Pak Uula

Начнем с того, что вот это объяснение неверное:

Мы передаём, как обычно, пакеты данных по незащищённому каналу, коим является интернет-соединение. Каждый пакет мы шифруем открытым ключом, а дешифровка осуществляется с помощью закрытого ключа.

Весь трафик шифруется алгоритмом симметричного шифрования (см RFC 4253, раздел 6.3), ключ для которого генерируется для каждого сеанса отдельно во время обмена ключами. Стандарт предписывает, чтобы все клиенты и серверы поддерживали схему Диффи-Хеллмана для генерации ключа.

Асимметричные ключи сервера прописаны в конфигурационном файле сервера /etc/ssh/sshd_config. По умолчанию в дебиан/убунте это три ключа: на эллиптической кривой (ECDSA), на кривой Эдвардса (Ed25519), и ключ RSA

/etc/ssh/ssh_host_ecdsa_key
/etc/ssh/ssh_host_ecdsa_key.pub
/etc/ssh/ssh_host_ed25519_key
/etc/ssh/ssh_host_ed25519_key.pub
/etc/ssh/ssh_host_rsa_key
/etc/ssh/ssh_host_rsa_key.pub

Эти ключи генерируются при установке Линукса. Например, в дебиане в процессе установки выполняется команда

dpkg-reconfigure openssh-server

Команда печатает тип ключа, число битов, хэш SHA1. Что-то вроде:

Creating SSH2 RSA key; this may take some time ...
2048 SHA256:BLUkgjGdbcFX9wCsfOoIG4gtkdSeex4K/xcnsRo0qEA root@server (RSA)
Creating SSH2 ECDSA key; this may take some time ...
256 SHA256:Rh6izWEXkCV6HZLIpzlGQje178vhDgb77ItaZgpDsIQ root@server (ECDSA)
Creating SSH2 ED25519 key; this may take some time ...
256 SHA256:UD4b7njwxWp1Q3wYf2R//udgPRzfGaeZ/6kE3VgZM+s root@server (ED25519)

Унутре её неонка ssh-keygen, понятное дело. Если интересно, как именно генерируются ключи, посмотрите скрипт debian/openssh-server.postinst из исходников пакета openssh

Разумеется, эти ключи не совпадают ни с одним из ключей клиентов. Эти ключи используются для подтверждения аутентичности сервера. При первом подключении к серверу ssh-клиент спросит вас - вы уверены, что вам ответил правильный сервер?

The authenticity of host '<name> (<address>)' can't be established.
ECDSA key fingerprint is SHA256:Rh6izWEXkCV6HZLIpzlGQje178vhDgb77ItaZgpDsIQ.
Are you sure you want to continue connecting (yes/no)?

Этот диалог предполагает, что вы откуда-то знаете хэш ключа вашего сервера (его можно узнать командой ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key.pub на сервере) Если вы ответите y, то клиент сохранит полученный публичный ключ в базу $HOME/.ssh/known_hosts:

Warning: Permanently added '<IP ADDRESS>' (ECDSA) to the list of known hosts.

Отвечая на ваш последний вопрос: да, сервер имел приватные ключи изначально. Они были сгенерированы при установке пакета openssh-server. И да, это совсем другие ключи, нежели те, которые вы сгенерировали у себя на стороне клиента.

Открытый ключ клиента загружается на сервер только в том случае, если вы хотите аутентифицироваться без пароля, по ключу (и это правильно! я вас в этом поддерживаю). Причем загружается он не абы куда, а добавляется в файл $HOME/.ssh/authorized_keys. Предполагается, что доступ к этому файлу есть только у пользователя, и поэтому ключам из этого файла можно доверять.

Но в общем случае загружать публичный ключ клиента на сервер необязательно. Большинство серверов поддерживают аутентификацию по пользователю/паролю, для которой публичный ключ не нужен.

→ Ссылка