从具有多个签名的签名可执行文件中读取证书数据

时间:2015-02-28 02:53:25

标签: digital-signature sha1 sha256 cryptoapi authenticode

微软正在远离SHA1。结果,许多可执行文件现在具有两个或更多个签名;一个使用SHA1摘要以实现向后兼容,另一个使用SHA256。

例如,如果从Visual Studio 2013查看vstest.executionengine.exe的属性(查看Windows 8或Server 2012上的属性),您将看到它有3个不同证书的3个不同签名。

我已经拥有使用CryptQueryObjectCryptMsgGetParam和.NET SignedCms组合的代码,但它只能看到3个签名中的1个。一个签名者似乎只有一条消息。

我需要获取所有签名的证书信息。如何对多个签名进行建模 - 是单个消息中的多个消息还是多个签名者? Microsoft是否添加了新的API或新标志来访问多个签名?

1 个答案:

答案 0 :(得分:6)

事实证明,微软(有点)隐藏了后续签名。添加其他签名时,整个CMS结构将添加为无符号属性。

因此,例如,解码为.NET SignedCms的双重签名的Authenticode签名将具有一个签名者,并且SignerInfo将在UnsignedAttributes中具有值。如果您获取属性ASN RawData值并将其传递给SignedCms.Decode,您将获得第二个签名。

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

似乎不是向根签名签名者添加另一个属性,而是在最内层的签名者属性中添加该属性。

另请注意,并非所有属性都是内部签名,我认为您需要检查属性上的正确Oid。

怀疑这是微软保持向后兼容性的最佳方式。