33

Я использую SSH (если быть точным, OpenSSH 5.5p1 в Linux). У меня есть ключ, на котором у меня есть пароль. Я использую это для обычного входа в компьютерные вещи.

Могу ли я также использовать его для подписи файлов?

Насколько я понимаю, ключ SSH является ключом RSA (или DSA), и во время процесса входа в систему SSH он используется для подписи сообщений, отправляемых на сервер. Таким образом, в принципе и на практике, он может быть использован для подписи вещей - действительно, это его единственная цель.

Но, насколько я вижу, нет способа использовать ключ для подписи произвольного файла (как, скажем, с PGP). Есть ли способ сделать это?

3 ответа3

22

Не может быть способа сделать это только с помощью инструментов 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.

10

@ Ответ Тома помог мне начать, но не сработал.

Эти команды будут работать с:

  • OpenSSL 1.0.1 14 марта 2012
  • OpenSSH_5.9p1

Использование pkeyutl

# openssl pkeyutl -sign -inkey ~/.ssh/id_sample -in $1 > $1.sig
# ssh-keygen -e -f ~/.ssh/id_sample.pub -m PKCS8 > pub
# openssl pkeyutl -verify -pubin -inkey pub -in $1 -sigfile $1.sig
Signature Verified Successfully

Использование dgst

# openssl dgst -sign ~/.ssh/id_sample $1 > $1.sig
# ssh-keygen -e -f ~/.ssh/id_sample.pub -m PKCS8 > pub
# openssl dgst -verify pub -signature $1.sig $1
Verified OK

Версия pkeyutl может подписывать только файлы небольшого размера. В то время как dgst может подписывать произвольно большие файлы, потому что перед подписанием результата требуется дайджест.

-3

Чтобы проверить эти подписи - более простое решение:

Более простой способ убедиться, что подписанный документ одинаков, - заново сгенерировать файл цифровой подписи, а затем использовать diff, чтобы проверить, совпадают ли два файла подписи.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .