Ответ 1
Чтобы добавить к ответу выше и вашему комментарию, Существует четыре строительных блока для сеанса ssh
- Шифрование (симметричные ключи, полученные после ввода ключа за сеанс)
- Целостность данных (MAC, например, SHA, HMAC)
- Основные методы обмена ключами
- Открытый ключ или методы ключа хоста
согласование алгоритма SSH включает в себя конечный автомат обмена ключами который начинается, когда отправляется сообщение SSH_MSG_KEXINIT вместе с списком алгоритмов.
Метод обмена ключами или просто kex указывает ключи сеанса для общедоступных ключей хоста проверки подлинности хоста и проверки подлинности хоста (ssh-rsa
, ssh-dss
..), которые отправляются клиенту. Следующий шаг - основные шаги, которые выполняются для kex с использованием алгоритма обмена ключами Diffie hellman
цитирование RFC https://tools.ietf.org/html/rfc4253
Для обмена ключами используются следующие шаги. В этом случае C является клиент; S - сервер; p - большое безопасное начало; g - генератор для подгруппы GF (p); q - порядок подгруппы; V_S - это S строка идентификации; V_C - идентификационная строка C; K_S - это S ключ общедоступного хоста; I_C - сообщение C SSH_MSG_KEXINIT, а I_S - S Сообщение SSH_MSG_KEXINIT, которое было обменено до этой части начинается.
C генерирует случайное число x (1 < x < q) и вычисляет e = g ^ x mod p. C отправляет e в S.
S генерирует случайное число y (0 < y < q) и вычисляет f = g ^ y mod p. S принимает e. Он вычисляет K = e ^ y mod p, H = hash (V_C || V_S || I_C || I_S || K_S || e || f || K) (эти элементы кодируются в соответствии с их типами, см. ниже), и подпись s на H со своим личным ключом хоста. S отправляет (K_S || f || s) до C. Операция подписи может включать вторая операция хеширования.
C проверяет, что K_S действительно является ключом хоста для S (например, используя сертификаты или локальную базу данных). C также разрешено принимать ключ без проверки; однако, это сделает протокол небезопасен против активных атак (но может быть желательным для практические причины в краткосрочной перспективе во многих средах). C тогда вычисляет K = f ^ x mod p, H = hash (V_C || V_S || I_C || I_S || K_S || e || f || K) и проверяет подпись s на H.
локальная база данных, упомянутая в шаге 3 в определенных системах, может быть файлом .ssh/known_hosts. Поэтому, чтобы ответить на ваш вопрос, открытый ключ отправляется клиенту хостом во время обмена ключами.
В настоящее время определены следующие форматы открытых ключей и/или сертификатов:
ssh-dss ТРЕБУЕТСЯ знак Raw DSS
ssh-rsa РЕКОМЕНДУЕМЫЙ знак Raw RSA Key
pgp-sign-rsa ДОПОЛНИТЕЛЬНЫЙ знак сертификатов OpenPGP (ключ RSA)
pgp-sign-dss ДОПОЛНИТЕЛЬНЫЙ знак сертификатов OpenPGP (ключ DSS)