Чтение данных сертификата из подписанных исполняемых файлов с несколькими подписями
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 сохранить обратную совместимость.