Когда проверяю подписанные EXE/DLL с помощью MS signtool verify /v /kp, оно всегда выдает список Cross Certificate Chain, даже если кросс-сертификат не использовался при подписывании файла. Судя по всему, наличие этой цепочки зависит скорее от ключа /kp, нежели от состава подписи. Где signtool берет эту цепочку — сугубо из локальных хранилищ?
Хочется иметь возможность увидеть объективную структуру подписи, добавленной к файлу. Подписи с кросс-сертификатом и без него различаются и по объему, и по составу. А чем можно посмотреть параметры подписи (хэши, реквизиты сертификатов, даты и прочее)?
Нагуглил "openssl asn1parse -inform der" — оно выдает какие-то невнятные сокращения, и неизменно добавляет "error in encoding".
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>чем можно посмотреть параметры подписи (хэши, реквизиты сертификатов, даты и прочее)?
Обнаружил, что более-менее подробную информацию о подписи выдает SigCheck от SysInternals, с ключами -i -h (хоть бы одна собака в нескольких десятках найденных статей/постов упомянула об этом).
Но и SigCheck выдает один и тот же список сертификатов и для файлов, подписанных с кросс-сертификатами MS, и без них, а также для файлов, подписанных с разными кросс-сертификатами. Различаются только общие контрольные суммы файлов.
Где-нибудь вообще описано, каким образом кросс-сертификаты указываются в подписи? Или это сугубо внутренняя магия MS?
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Где-нибудь вообще описано, каким образом кросс-сертификаты указываются в подписи? Или это сугубо внутренняя магия MS?
А разве они не добавляются в цифровую подпись также, как и все остальные сертификаты?
По моим наблюдениям, именно так это и происходит, без какой-либо магии.
Если сделать две версии одного и того же файла — одну с обычной подписью, другую с кроссом, то можно заметить, что во втором
случае длина "хвостовой" части файла, где лежит подпись, немного больше и там присутствует "Microsoft Code Verification Root".
Ну и "signtool verify /v /kp /tw" в первом случае выводит "Signing Certificate Chain" и "Timestamp Verified by", а во
втором добавляет к этому еще и "Cross Certificate Chain". По крайней мере, у меня так это работает.
Там базово изложено, как цифровая подпись добавляется в исполняемый файл.
Правда, для более глубокого вникания потребуется еще проштудировать десяток RFC и разобраться с ASN.1/BER...
Здравствуйте, okman, Вы писали:
O>А разве они не добавляются в цифровую подпись также, как и все остальные сертификаты?
Я вижу, что какие-то реквизиты кросс-сертификата присутствуют в подписи, но ни SigCheck, ни SignTool verify их не показывают. Показывает только SignTool verify с ключом /kp. Выдачи SigCheck для файла, подписанного с разными кросс-сертификатами, отличаются только хэшами самих файлов — списки сертификатов одинаковые.
O>можно заметить, что во втором случае длина "хвостовой" части файла, где лежит подпись, немного больше и там присутствует "Microsoft Code Verification Root".
Кстати, саму подпись удобно просматривать и извлекать в FAR — ArcLite показывает ее элементом "CERTIFICATE".
O>Ну и "signtool verify /v /kp /tw" в первом случае выводит "Signing Certificate Chain" и "Timestamp Verified by", а во O>втором добавляет к этому еще и "Cross Certificate Chain". По крайней мере, у меня так это работает.
Вот и я о том, что цепочку кросс-сертификатов в подписи видит только SignTool с ключом /kp, а все остальное видит только основные. Поэтому и хочется разобрать подпись на элементы и понять, как она строится в каждом случае. certutil -asn вроде бы как-то разбирает саму подпись (не PE-файл с нею), но выдает огромное количество самых элементарных записей, и вдобавок не факт, что правильно, поскольку в итоге завершается в "decode error".
O>Вообще, у Microsoft есть документ "Windows Authenticode Portable Executable Signature Format":
Спасибо, он у меня есть, но не хотелось без нужды ковыряться руками. Надеялся, что существуют утилиты, умеющие разбирать подпись с разумной степенью подробности.
O>Правда, для более глубокого вникания потребуется еще проштудировать десяток RFC и разобраться с ASN.1/BER...