Чтение данных сертификата из подписанных исполняемых файлов с несколькими подписями

Microsoft отходит от SHA1. В результате многие исполняемые файлы теперь имеют две или более подписи; один использует дайджест SHA1 для обратной совместимости, а другой - SHA256.

Например, если вы посмотрите на свойства vstest.executionengine.exe из Visual Studio 2013 (посмотрите на свойства в Windows 8 или Server 2012) вы увидите, что он имеет 3 разных подписи из 3 разных сертификатов.

У меня уже есть код, который использует комбинацию CryptQueryObject, CryptMsgGetParamи.NET SignedCms, но он видит только 1 из 3 подписей. Кажется, есть только одно сообщение с одним подписавшим.

Мне нужно получить информацию о сертификате для всех подписей. Как моделируются несколько подписей - это несколько сообщений или несколько подписчиков в одном сообщении? Добавили ли Microsoft новые API или новые флаги для доступа к нескольким сигнатурам?

1 ответ

Оказывается, Microsoft (вроде) прячет последующие подписи. При добавлении другой подписи вся структура CMS добавляется как неподписанный атрибут.

Так, например, подпись Authenticode с двойной подписью, декодированная как.NET SignedCms, будет иметь одного подписавшего, и что SignerInfo будет иметь значение в UnsignedAttributes. Если вы возьмете значение атрибута ASN RawData и передадите его в SignedCms.Decode, вы получите вторую подпись.

// decode inner signature    
signedCms2.Decode(signedCms1.SignerInfos[0].UnsignedAttributes[0].Values[0].RawData);

Также представляется, что вместо добавления другого атрибута к корневому подписывающему лицу атрибут добавляется в самые внутренние атрибуты подписывающих лиц.

Также обратите внимание, что не все атрибуты являются внутренними подписями, я думаю, вам нужно проверить правильность Oid для атрибута.

Есть подозрение, что это был лучший способ для Microsoft сохранить обратную совместимость.

Другие вопросы по тегам