我如何从签名的c#exe中读取公共密钥
-
03-10-2019 - |
题
我正在使用
signcode.exe with an spc/pvk combo
该文件需要在运行时读取自己的公钥,以验证一些数据。我跌倒了许多不同的途径。
我试过了
X509Certificate executingCert = X509Certificate.CreateFromSignedFile(exe);
然后执行核算为null。我猜想SignCode不会创建X509签名的文件,尽管如果有一个更改的开关,我很乐意这样做。
编辑事实证明,上述确实有效。...我的空检查向后检查(!=!==):)
Assembly asm = Assembly.GetExecutingAssembly();
string exe = asm.Location;
X509Certificate executingCert = X509Certificate.CreateFromSignedFile(exe);
if (executingCert != null)
{
Console.WriteLine("Assembly is signed");
byte[] assemblyKey = executingCert.GetPublicKey();
}
解决方案
SignCode(对于.NET 1.0和1.1)使用AuthenTicode签名,据我所知,它缺少.NET Framework托管接口。您可能需要使用P/Invoke在Win32 API中调用例程,例如在此中找到的 KB文章:如何从AuthenTicode签名的可执行文件中获取信息. 。可能需要使用 cryptqueryObject 这将为您提供证书,然后您可能必须找到另一个例程来从中摘取公共钥匙。
查看此相关的堆栈流问题,该问题有很多答案: WinverifyTrust检查是否有特定的签名?
其他提示
尝试这样的事情:
Assembly.GetEntryAssembly().GetName().GetPublicKey()
在这种情况下,我使用了GetEntryAssembly,但是您当然可以在任何已加载的组件上调用该方法。
不隶属于 StackOverflow