Sco*_*ott 4 sha1 sha256 authenticode cryptoapi digital-signature
微软正在远离SHA1.结果,许多可执行文件现在具有两个或更多个签名; 一个使用SHA1摘要以实现向后兼容,另一个使用SHA256.
例如,如果您查看vstest.executionengine.exe
Visual Studio 2013的属性(查看Windows 8或Server 2012上的属性),您将看到它有来自3个不同证书的3个不同签名.
我已经有一个使用的组合代码CryptQueryObject
,CryptMsgGetParam
和.NET SignedCms
,但它只能看到3个签名1.一个签名者似乎只有一条消息.
我需要获取所有签名的证书信息.如何对多个签名进行建模 - 是单个消息中的多个消息还是多个签名者?Microsoft是否添加了新的API或新标志来访问多个签名?
事实证明,微软(有点)隐藏了后续的签名.添加其他签名时,整个CMS结构将添加为无符号属性.
因此,例如,解码为.NET SignedCms的双重签名的Authenticode签名将具有一个签名者,并且SignerInfo将具有UnsignedAttributes中的值.如果您获取属性ASN RawData值并将其传递给SignedCms.Decode,您将获得第二个签名.
// decode inner signature
signedCms2.Decode(signedCms1.SignerInfos[0].UnsignedAttributes[0].Values[0].RawData);
Run Code Online (Sandbox Code Playgroud)
似乎不是向根签名签名者添加另一个属性,而是在最内层签名者属性中添加该属性.
另请注意,并非所有属性都是内部签名,我认为您需要检查属性上的正确Oid.
怀疑这是微软保持向后兼容性的最佳方式.