Репозиторий FreeBSD - как выполнить проверку подписи вручную?


11

Я пытаюсь проверить подпись пакета на сайте пакета FreeBSD

wget http://pkg.freebsd.org/FreeBSD:11:amd64/latest/digests.txz
tar xf digests.txz

Это дает три файла: digests, digests.pub digests.sig
я понимаю, что digests.sigэто подпись для файла digestsс digests.pubкак открытым ключом. Но я попытался подтвердить это:

openssl dgst -verify digests.pub -signature digests.sig digests

и получил сообщение

Verification Failure

Я предполагаю, что у меня что-то не так - кто-нибудь может сказать мне, что мне не хватает?

EDIT: на основе охоты через исходный код, я думаю , что важная функция должна быть найдена здесь , называется , rsa_verify_cert_cbкоторая вызывает RSA_verifyиз библиотеки OpenSSL. Но я не выяснил, что ему подается, и можно ли вызвать эту функцию с помощью opensslинструментов командной строки.


Это выглядит актуально lists.freebsd.org/pipermail/freebsd-ports/2014-Feb февраля/ Однако команда, аналогичная упомянутой там openssl rsautl -pubin -inkey digests.pub -verify -in digests.sig -asn1parse , похоже, тоже не подходит.
SauceCode

... то есть не похоже наsha256sum digests
SauceCode

Ответы:


1

Поскольку в Интернете нет инструкции «Как сделать» для ручной проверки пакета FreeBSD, вот что я понял.

Хитрость в том, что октетная строка в openssl rsautlвыводе на самом деле является хешем строки, которая является хешем SHA256 файла.

Например, скачайте current http://pkg.freebsd.org/FreeBSD:12:amd64/latest/digests.txz, распакуйте его и сделайте следующее:

Метод 1 (использование одной строки openssl dgst)

Здесь важно сделать, tr -d '\n'чтобы удалить новую строку из стандартного ввода, чтобы она не включалась в строку ввода для openssl dgst.

sha256 -q digests | tr -d '\n' | openssl dgst -verify digests.pub -signature digests.sig

Эта команда должна вывести Verified OK.

Метод 2 (визуальное сравнение строки октета из файла .sig с хэшем, созданным вручную)

  1. Используйте утилиту OpenSSL для выгрузки содержимого из digests.sig

    openssl rsautl -pubin -inkey digests.pub -verify -in digests.sig -asn1parse
    0:d=0  hl=2 l=  49 cons: SEQUENCE          
    2:d=1  hl=2 l=  13 cons:  SEQUENCE          
    4:d=2  hl=2 l=   9 prim:   OBJECT            :sha256
    15:d=2  hl=2 l=   0 prim:   NULL              
    17:d=1  hl=2 l=  32 prim:  OCTET STRING      
      0000 - ac c6 ac be cd 5e 61 63-62 82 62 4b ba 77 37 6e   .....^acb.bK.w7n
      0010 - 0b fa ea ef 6e 10 21 01-62 64 06 2f d0 f1 60 22   ....n.!.bd./..`"
    

    Здесь вы можете видеть, что внедренный объект - это хеш SHA256, и его значение равно acc6acbecd5e61636282624bba77376e0bfaeaef6e1021016264062fd0f16022.

  2. Теперь рассчитайте SHA256 файла digests:

    sha256 -q digests
    8db18c93bea414fd8a281f5f3795b2ca4be51479c18b225ff87b8aa957ec2c5d
    
  3. И, наконец, вычислите SHA256 этой строки с помощью echoкоманды и сравните со значением, возвращаемым openssl rsautl:
    echo -n 8db18c93bea414fd8a281f5f3795b2ca4be51479c18b225ff87b8aa957ec2c5d | sha256
    acc6acbecd5e61636282624bba77376e0bfaeaef6e1021016264062fd0f16022
    

Обратите внимание, что значение из шага 3. совпадает со значением из шага 1., поэтому файл digestsдействителен.


0

В этом сообщении говорится, что открытый ключ не соответствует загруженному вами файлу. Согласно man-странице для dgst -verify filename проверьте подпись, используя открытый ключ в «filename». Вывод: «Подтверждение в порядке» или «Ошибка проверки» . Наиболее вероятная причина - файл поврежден во время загрузки. Я попытался бы загрузить его снова, и если он по-прежнему не проходит проверку, это признак скомпрометированной ссылки на скачивание (но, поскольку она с веб-сайта freebsd, я подозреваю, что это просто ошибка загрузки. Даже тогда я проверю новую скачать просто чтобы быть на безопасной стороне). Если у вас медленное / ненадежное подключение к Интернету, может потребоваться несколько попыток, чтобы загрузить его правильно. Если вам когда-нибудь понадобится проверить информацию о командах


Это было некоторое время назад, но я уверен, что это не было ошибкой загрузки (или скомпрометированной загрузкой), так как я пробовал это несколько раз.
SauceCode
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.