Какой формат подписи ожидает Openssl pkeyutl? - PullRequest
2 голосов
/ 08 октября 2009

Я пытаюсь проверить файл, который был подписан хэшированием с помощью SHA-1 и шифрованием хэша с помощью закрытого ключа RSA.

Очевидно, я использую открытый ключ RSA для проверки. Ключ в формате DER.

Проверка подписи работает правильно с использованием класса подписи Java.

Команда openssl, которую я пытаюсь (и результат):

       ~/Downloads/openssl-1.0.0-beta3/apps/openssl pkeyutl -in encryptedZip.bin 
-keyform DER -verify -sigfile savedDigitalSignature.txt -pubin -inkey public.der
    WARNING: can't open config file: /usr/local/ssl/openssl.cnf
    Signature Verification Failure

В конфигурационном файле openssl я не вижу ничего подходящего, поэтому я не считаю это предупреждение значительным.

Файл saveDigitalSignature.txt содержит байты подписи.

Моя теория состоит в том, что openssl ищет цифровую подпись в каком-то определенном формате файла, но я не нашел ничего в документации, указывающей, что это должно быть.

Мысли

Ответы [ 3 ]

2 голосов
/ 08 октября 2009

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

  1. Входная подпись (-sigfile) должна быть двоичной подписью. Для RSA отступ должен быть PKCS # 1.
  2. Входные данные должны быть двоичным дайджестом. Если вы подпишите его с помощью SHA1, этот файл может содержать только 20 байтов.
  3. Открытый ключ должен быть в SubjectPublicKeyInfo в формате X.509 в формате DER или PEM.
0 голосов
/ 08 октября 2009

Java ожидает, что подпись RSA будет следовать за PKCS # 1: последовательность алгоритма дайджеста и дайджеста, затем подписанная (зашифрованная с помощью закрытого ключа RSA).

Может случиться так, что pkeyutl ожидает только дайджест, а не структуру ASN.1, но это было бы удивительным пренебрежением совместимостью. В любом случае, после того как данные «подписаны», выходные данные «сигнатуры» будут выглядеть аналогично - просто случайная строка октетов.

Пожалуйста, опубликуйте образец подписи, сгенерированной pkeyutl, вместе с открытым ключом, который его проверит, и файлом для проверки.

0 голосов
/ 08 октября 2009

Я еще не использовал OpenSSL-1.0.0-beta3, поэтому я не знаком с pkeyutl, но команда dgst также генерирует и проверяет цифровые подписи и ожидает, что подписи будут в простом виде, совершенно неукрашенный бинарный файл.

Например, для сигнатуры RSA он ожидает двоичный двоичный объект, представляющий один BigNum. Глядя на страницу maual для pkeyutl, кажется вероятным, что он работает так же. Простым тестом будет использование pkeyutl для подписи чего-либо и проверки выходных данных (если размер в битах совпадает с длиной ключа RSA, это обычный BigNum - если он больше, попробуйте использовать dumpasn1, чтобы проверить, имеет ли он формат DER ).

...