ssh-keygen -y -e -f <private key>принимает закрытый ключ и печатает соответствующий открытый ключ, который можно напрямую сравнить с доступными открытыми ключами. (Подсказка: остерегайтесь комментариев или ключевых опций.)
(Как, черт возьми, это происходит? Я могу только надеяться, что открытый ключ закодирован прямо или косвенно в закрытом ключе ...)
Я сам нуждался в этом и использовал следующую однострочную версию Bash. Он не должен ничего выводить, если ключи принадлежат друг другу. Примените немного -qк diff в скриптах, и diff только устанавливает соответствующий код возврата.
@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, каким бы он ни был .
В моем случае я должен убедиться, что пара не была повреждена. Итак, я решил сравнить следующее:
Это действительно должно заменить принятый ответ или по крайней мере превзойти его с точки зрения голосов.
Томанский
Спасибо! Эта команда не работает с ключами с парольной фразой, она не запрашивает это в интерактивном режиме. Я извлек содержимое команды two () в файлы и расшифровал их, это работает.
Ярослав Никитенко
5
Если они на вашей локальной системе, придерживаться id_rsa.pubв вашей $HOME/.ssh/authorized_keysи sshс localhostпомощью id_rsaключа. Если это работает, то они совпадают.
ssh -v
тоже очень помогает.Ответы:
Я предпочел бы
ssh-keygen -y -e -f <private key>
путь вместо принятого ответа Как вы тестируете открытую / закрытую пару ключей DSA? Переполнение стека.ssh-keygen -y -e -f <private key>
принимает закрытый ключ и печатает соответствующий открытый ключ, который можно напрямую сравнить с доступными открытыми ключами. (Подсказка: остерегайтесь комментариев или ключевых опций.)(Как, черт возьми, это происходит? Я могу только надеяться, что открытый ключ закодирован прямо или косвенно в закрытом ключе ...)
Я сам нуждался в этом и использовал следующую однострочную версию Bash. Он не должен ничего выводить, если ключи принадлежат друг другу. Примените немного
-q
к diff в скриптах, и diff только устанавливает соответствующий код возврата.источник
ssh-keygen -y -e -f id_rsa
он вообще не проверяет id_rsa, а просто возвращает значение из id_rsa.pub. Так, например, если выecho 5 > id_rsa
удалите закрытый ключ, а затем выполните различие, оно пройдет! Кроме того, выполнение,ssh-keygen -yef foo
где foo не является допустимым ключом (и не имеет соответствующего foo.pub), блокирует ожидание ввода данных пользователем, поэтому будьте осторожны, используя это в скрипте.В зависимости от того, где вы получаете файл открытого ключа, который вы тестируете, принятый ответ может дать ложноположительные результаты. Это из-за поведения, описанного в комментарии @drewbenn. В частности, когда опция -e используется с файлом закрытого ключа в качестве параметра опции -f, она просто повторяет (но форматирует) то, что находится в связанном файле открытого ключа.
Другими словами,
(по-видимому) генерирует значение открытого ключа, и
просто и выводит (и переформатирует) ключ в существующем id_rsa.pub, каким бы он ни был .
В моем случае я должен убедиться, что пара не была повреждена. Итак, я решил сравнить следующее:
с участием
Следовательно:
Возможно, это не так гибко, но лучше для моих нужд. Может быть, это помогает кому-то еще.
источник
Если они на вашей локальной системе, придерживаться
id_rsa.pub
в вашей$HOME/.ssh/authorized_keys
иssh
сlocalhost
помощьюid_rsa
ключа. Если это работает, то они совпадают.источник