如何从签名的C#exe读取公钥

如何从签名的C#exe读取公钥,c#,public-key,x509,signtool,C#,Public Key,X509,Signtool,我正在使用 signcode.exe with an spc/pvk combo X509Certificate executingCert = X509Certificate.CreateFromSignedFile(exe); 文件需要在运行时读取自己的公钥,以便验证某些数据。我去过很多不同的地方 X509Certificate executingCert = X509Certificate.CreateFromSignedFile(exe); 我试过了 X509Certificate

我正在使用

signcode.exe with an spc/pvk combo
X509Certificate executingCert = X509Certificate.CreateFromSignedFile(exe);
文件需要在运行时读取自己的公钥,以便验证某些数据。我去过很多不同的地方

X509Certificate executingCert = X509Certificate.CreateFromSignedFile(exe);
我试过了

X509Certificate executingCert = X509Certificate.CreateFromSignedFile(exe);
executingCert随后为空。我猜signcode并没有创建一个X509签名文件,不过如果有一个切换到更改的话,我很乐意这样做

X509Certificate executingCert = X509Certificate.CreateFromSignedFile(exe);
编辑 事实证明,上述方法确实有效。。。。我将空值检查向后(!=!=):)

X509Certificate executingCert = X509Certificate.CreateFromSignedFile(exe);

试试这样:

X509Certificate executingCert = X509Certificate.CreateFromSignedFile(exe);
Assembly.GetEntryAssembly().GetName().GetPublicKey()
在这种情况下,我使用了GetEntryAssembly,但是您当然可以在任何加载的程序集上调用该方法。

SignCode(对于.Net 1.0和1.1)使用Authenticode签名,据我所知,它缺少.Net Framework管理的接口。您可能需要使用P/Invoke来调用Win32 API中的例程,如本文中的例程。你可能需要使用它来获得
X509Certificate executingCert = X509Certificate.CreateFromSignedFile(exe);
证书,然后您可能需要找到另一个例程从中提取公钥

X509Certificate executingCert = X509Certificate.CreateFromSignedFile(exe);

查看这个相关的StackOverflow问题,它有很多答案:

如果我可以完成所有的p/调用,那么这应该可以实现。读取的是强名称的公钥,而不是基于证书的数字签名!
X509Certificate executingCert = X509Certificate.CreateFromSignedFile(exe);