3

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

因此,在此过程中,我决定在我的系统上安装证书后对其进行测试。然后使用以下代码,我尝试验证证书身份验证的检查过程:

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 清单签名;但“从文件中选择”选项正在寻找 .pfx 扩展名。所以我想也许这种方法只适用于支持 Click-Once 生成的证书?

根据 BOL,“如果您有其他格式的密钥文件或证书,请将其存储在 Windows 证书存储中并选择前面过程中描述的证书。” 我在 Trusted Root Certificate Authorities 存储中安装了 X509Certificate。那不是 Windows 证书存储吗?因为证书存储窗口中没有显示任何内容。

除非我使用了错误的关键字组合,否则搜索在线资源也没有什么收获。现在我可以创建另一个 X509Certificate 和密钥,确保密钥的扩展名是 .pfx,但我想确保我在正确的解决方案上,然后再无偿转动我的轮子,我不相信这会是答案.

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

4

2 回答 2

3

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

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

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

于 2011-08-25T12:28:41.407 回答
1

问题是你想做什么。存在用于对程序集进行强命名的 .NET 签名(使用 RSA 密钥对),并且存在 Authenticode 可让您签署任何 PE 格式的文件,包括 DLL 文件中的程序集。请注意,Authenticode 不是特定于 .NET 的,并且对 .NET 一无所知。它签署PE结构。

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

所以你需要选择正确的工具并定义你想要达到的目标(签名是一种方法,而不是一个目标)。

于 2011-08-25T12:40:07.197 回答