微软正在远离SHA1。结果,许多可执行文件现在具有两个或更多个签名;一个使用SHA1摘要以实现向后兼容,另一个使用SHA256。
例如,如果从Visual Studio 2013查看vstest.executionengine.exe
的属性(查看Windows 8或Server 2012上的属性),您将看到它有3个不同证书的3个不同签名。
我已经拥有使用CryptQueryObject
,CryptMsgGetParam
和.NET SignedCms
组合的代码,但它只能看到3个签名中的1个。一个签名者似乎只有一条消息。
我需要获取所有签名的证书信息。如何对多个签名进行建模 - 是单个消息中的多个消息还是多个签名者? Microsoft是否添加了新的API或新标志来访问多个签名?
答案 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。
怀疑这是微软保持向后兼容性的最佳方式。