Можливо, не існує способу зробити це лише за допомогою інструментів OpenSSH.
Але це можна зробити досить легко за допомогою інструментів OpenSSL. Насправді, принаймні два способи це зробити. У прикладах нижче - ~/.ssh/id_rsa
це ваш приватний ключ.
Один із способів використання dgst :
openssl dgst -sign ~/.ssh/id_rsa some-file
Інший використовує pkeyutl :
openssl pkeyutl -sign -inkey ~/.ssh/id_rsa -in some-file
Обидва вони записують двійковий підпис на стандартний вихід. dgst бере -hex
опцію, надрукує текстове подання з деякими подробицями про форму підпису. pkeyutl приймає -hexdump
варіант, який є менш корисним. Обидва приймуть і ключі RSA, і DSA. Я поняття не маю, який формат виводу. Дві команди створюють різні формати. У мене складається враження, що pkeyutl вважається більш сучасним, ніж dgst .
Щоб перевірити ці підписи:
openssl dgst -verify $PUBLIC_KEY_FILE -signature signature-file some-file
і:
openssl pkeyutl -verify -inkey $PUBLIC_KEY_FILE -sigfile signature-file -in some-file
Проблема тут є $PUBLIC_KEY_FILE
. OpenSSL не може читати формат відкритого ключа OpenSSH, тому його не можна просто використовувати id_rsa.pub
. У вас є кілька варіантів, жоден ідеал.
Якщо у вас є версія OpenSSH 5.6 або новішої версії, ви, очевидно, можете це зробити:
ssh-keygen -e -f ~/.ssh/id_rsa.pub -m pem
Який запише відкритий ключ на стандартний вихід у форматі PEM, який OpenSSL може прочитати.
Якщо у вас є приватний ключ, і це ключ RSA, тоді ви можете витягнути з нього відкритий ключ (я припускаю, що закодований PEM файл приватного ключа включає копію відкритого ключа, оскільки не можна отримати відкритий ключ від приватного ключа) і скористайтеся цим:
openssl rsa -in ~/.ssh/id_rsa -pubout
Я не знаю, чи є еквівалент DSA. Зауважте, що такий підхід вимагає певної співпраці з власником приватного ключа, який повинен буде витягнути відкритий ключ та надіслати його до потенційного верифікатора.
Нарешті, ви можете використовувати програму Python, написану розділом під назвою Lars, для перетворення відкритого ключа з формату OpenSSH у формат OpenSSL.