Как проверить соответствие пары открытый / закрытый ключ RSA

72

У меня есть два файла, id_rsaи id_rsa.pub. Какую команду можно использовать для проверки правильности пары?

Райан
источник
Я подтвердлю ответ Мичуельника; это спасло меня от необходимости создавать новую пару ключей, спасибо. ssh -vтоже очень помогает.
Крис К

Ответы:

93

Я предпочел бы ssh-keygen -y -e -f <private key>путь вместо принятого ответа Как вы тестируете открытую / закрытую пару ключей DSA? Переполнение стека.

ssh-keygen -y -e -f <private key>принимает закрытый ключ и печатает соответствующий открытый ключ, который можно напрямую сравнить с доступными открытыми ключами. (Подсказка: остерегайтесь комментариев или ключевых опций.)

(Как, черт возьми, это происходит? Я могу только надеяться, что открытый ключ закодирован прямо или косвенно в закрытом ключе ...)

Я сам нуждался в этом и использовал следующую однострочную версию Bash. Он не должен ничего выводить, если ключи принадлежат друг другу. Примените немного -qк diff в скриптах, и diff только устанавливает соответствующий код возврата.

PRIVKEY=id_rsa
TESTKEY=id_rsa.pub
diff <( ssh-keygen -y -e -f "$PRIVKEY" ) <( ssh-keygen -y -e -f "$TESTKEY" )
Michuelnik
источник
1
@MichaelHampton: теперь я понимаю ваш комментарий. «принятый ответ» должен относиться к вопросу о стекаповороте, а не к этому вопросу ...
Мишельник
1
@Sirch: Я думал, что решение о том, какой ключ является закрытым, а какой является открытым, является чисто случайным, поскольку оба ключа равны. То, что один ключ шифрует, может быть расшифровано только другим. И если бы один ключ можно было получить от другого, все это бы не сработало.
Мишельник,
1
@Michuelnik Вы можете получить открытый ключ из закрытого ключа. Вы не можете получить секретный ключ из открытого ключа. Не говорили о материале, который он шифрует.
Sirch
1
@Michuelnik imho, вопрос не по теме на SO и по теме здесь (и / или Superuser). Имхо, он не должен быть помечен как дубликат, а вместо этого помечен там для миграции. Но это покрыто обоими, поэтому мне нравится более полный обмен информацией.
Крис К
10
Пока существует id_rsa.pub, ssh-keygen -y -e -f id_rsaон вообще не проверяет id_rsa, а просто возвращает значение из id_rsa.pub. Так, например, если вы echo 5 > id_rsaудалите закрытый ключ, а затем выполните различие, оно пройдет! Кроме того, выполнение, ssh-keygen -yef fooгде foo не является допустимым ключом (и не имеет соответствующего foo.pub), блокирует ожидание ввода данных пользователем, поэтому будьте осторожны, используя это в скрипте.
32

В зависимости от того, где вы получаете файл открытого ключа, который вы тестируете, принятый ответ может дать ложноположительные результаты. Это из-за поведения, описанного в комментарии @drewbenn. В частности, когда опция -e используется с файлом закрытого ключа в качестве параметра опции -f, она просто повторяет (но форматирует) то, что находится в связанном файле открытого ключа.

Другими словами,

ssh-keygen -y -f id_rsa

(по-видимому) генерирует значение открытого ключа, и

ssh-keygen -y -e -f id_rsa

просто и выводит (и переформатирует) ключ в существующем id_rsa.pub, каким бы он ни был .

В моем случае я должен убедиться, что пара не была повреждена. Итак, я решил сравнить следующее:

ssh-keygen -y -f id_rsa | cut -d' ' -f 2

с участием

cut -d' ' -f 2 id_rsa.pub

Следовательно:

diff <(cut -d' ' -f 2 id_rsa.pub) <(ssh-keygen -y -f id_rsa | cut -d' ' -f 2)

Возможно, это не так гибко, но лучше для моих нужд. Может быть, это помогает кому-то еще.

twildfarmer
источник
5
Это действительно должно заменить принятый ответ или по крайней мере превзойти его с точки зрения голосов.
Томанский
Спасибо! Эта команда не работает с ключами с парольной фразой, она не запрашивает это в интерактивном режиме. Я извлек содержимое команды two () в файлы и расшифровал их, это работает.
Ярослав Никитенко
5

Если они на вашей локальной системе, придерживаться id_rsa.pubв вашей $HOME/.ssh/authorized_keysи sshс localhostпомощью id_rsaключа. Если это работает, то они совпадают.

cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
ssh -i $HOME/.ssh/id_rsa localhost
Майкл Хэмптон
источник