可以使用x509证书对. net程序集进行签名吗?

本文关键字:程序集 x509 证书 net 可以使 | 更新日期: 2023-09-27 18:06:42

我相信我已经对x509证书有了基本的了解,并且已经为我的开发环境创建了证书和私钥。现在更熟悉x509证书类和其他相关权限。

所以在这个过程中,我决定在我的系统上安装一个证书后测试它。然后使用以下代码,我尝试验证认证身份验证的检查过程:

const string x509Cert = @"'PathToMyCertificate'LMC.cer";
var cert = new X509Certificate(x509Cert);
var pmc = new PublisherMembershipCondition(cert);
if(pmc.Check(Assembly.GetCallingAssembly().Evidence))
{
   Console.WriteLine("Assembly belongs to publisher");
}

当然,正如预期的那样,内部代码块不会执行。因此,我想使用证书密钥对程序集进行简单签名,但是"简单"并不像我预期的那么简单。

我使用以下代码将证书分配给我的应用程序证据:

var publisher = new Publisher(X509Certificate.CreateFromCertFile(x509Cert));
var evidence = Assembly.GetCallingAssembly().Evidence;
evidence.AddHost(publisher);
// Create an identity permission based on publisher evidence.
var x509Permission = (PublisherIdentityPermission)publisher.CreateIdentityPermission(evidence);
x509Permission.Demand();

但这似乎也不起作用。接下来,我检查了项目的属性,看看是否有任何方法可以使用X509Certificate密钥在那里签名,但是没有。我看到的唯一接近的选择是与Click Once manifest签署;但是"从文件中选择"选项正在寻找一个。pfx扩展名。所以我想也许这种方法只适用于支持由点击一次生成的证书?

Per BOL, "如果您有另一种格式的密钥文件或证书,请将其存储在Windows证书存储库中,并选择上一过程中描述的证书。"我在受信任的根证书颁发机构存储区中安装了x509证书。那不是一个Windows证书存储吗?因为证书存储窗口中没有显示任何内容。

搜索在线资源也没有产生太多,除非我使用了错误的关键字组合。现在,我可以创建另一个x509证书和密钥,确保密钥的扩展名是。pfx,但我想确保在徒劳地旋转轮子之前,我是在正确的解决过程中,我不相信这将是答案。

那么,可以使用x509证书对.NET程序集进行签名吗?如果是,有哪些文档可以帮助执行此任务?

可以使用x509证书对. net程序集进行签名吗?

Publisher*类与Authenticode(tm)相关联。

查找命令行工具:* signcode(或signtool)* chktrust

了解如何使用有效的代码签名证书对任何.exe, .dll(和.cab, .ocx)进行签名。在谷歌上搜索一下Authenticode或"代码签名证书"也会很有帮助。

问题是你想做什么。存在用于对程序集进行强命名的。net签名(使用RSA密钥对),存在允许您以PE格式签名任何文件的Authenticode,包括DLL文件中的程序集。注意,Authenticode不是. net特有的,它对。net一无所知。它标志着PE结构。

正如poupou所说,对于Authenticode签名(使用适用于代码签名的X.509证书),您可以使用SignTool.exe工具。. net将在加载程序集时验证签名,但在某些情况下,这种验证可能需要额外的秒(如果操作系统执行CRL和OCSP检查链中的证书),从而减慢程序集加载速度。

因此,您需要选择正确的工具并定义您想要实现的目标(签名是一种方法,而不是目标)。