Як перевірити, чи збігається пара відкритих / приватних ключів RSA


71

У мене два файли, id_rsaі id_rsa.pub. Яку команду можна використовувати для перевірки, якщо вони є дійсною парою?


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

Відповіді:


91

Я б віддав перевагу ssh-keygen -y -e -f <private key>замість прийнятої відповіді: Як ви перевіряєте державну / приватну програму DSA? на стеку переповнення.

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

(Як чорт це робить? Я можу лише сподіватися, що відкритий ключ закодований прямо чи опосередковано в приватному ключі ...)

Мені це було потрібно і я використав наступний однолінійний баш. Він не повинен виводити нічого, якщо ключі належать разом. Застосуйте трохи -qдо розрізних сценаріїв, а diff лише встановить код повернення належним чином.

PRIVKEY=id_rsa
TESTKEY=id_rsa.pub
diff <( ssh-keygen -y -e -f "$PRIVKEY" ) <( ssh-keygen -y -e -f "$TESTKEY" )

1
@MichaelHampton: тепер я розумію ваш коментар. "прийнята відповідь" повинна посилатися на питання про stackoverflow, а не на це питання ...
Michuelnik

1
@Sirch: Я вважав, що ключ є приватним, а який - загальнодоступним, є випадковим випадком, оскільки два ключі рівні. Те, що один ключ шифрує, можна розшифрувати лише іншим. І якби один ключ можна було отримати з іншого, все це не вийшло б.
Мічуельник

1
@Michuelnik Ви можете отримати відкритий ключ із приватного ключа. Ви не можете отримати приватний ключ із відкритого ключа. Не говорили про матеріал, який він шифрує.
Сірч

1
@Michuelnik imho, це питання поза темою на SO та на тему тут (та / або Superuser). imho, це не повинно бути позначене як дублікат, а замість цього позначити там міграцію. Але це стосується обох, тому мені подобається більш повний обмін інформацією.
Кріс К

10
Поки id_rsa.pub взагалі ssh-keygen -y -e -f id_rsaне перевіряє id_rsa, а лише поверне значення з id_rsa.pub. Так, наприклад, якщо ви echo 5 > id_rsaвидалите приватний ключ, тоді зробіть diff, diff пройде! Крім того, ssh-keygen -yef fooякщо foo не є дійсним ключем (і не має відповідного foo.pub), заблокує очікування введення користувача, тому будьте обережні, використовуючи це в сценарії.

31

Залежно від того, де ви отримуєте файл відкритого ключа, який ви тестуєте, прийнята відповідь може дати помилкові позитивні результати. Це через поведінку, описану в коментарі @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)

Можливо, це не так гнучко, але краще для моїх потреб. Можливо, це допомагає комусь іншому.


5
Це дійсно повинно замінити прийняту відповідь або принаймні перевершити її за обґрунтуванням.
thomanski

Дякую! Ця команда не працює з ключами із парольною фразою, вона не запитує цього в інтерактивному режимі. Я витягнув два файли () командного вмісту до файлів і розмежував їх, що працює.
Ярослав Нікітенко

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.