Ответы:
Я предпочел бы 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" )
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, она просто повторяет (но форматирует) то, что находится в связанном файле открытого ключа.
Другими словами,
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)
Возможно, это не так гибко, но лучше для моих нужд. Может быть, это помогает кому-то еще.
Если они на вашей локальной системе, придерживаться 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
ssh -v
тоже очень помогает.