延迟签名允许我们只使用公司的公有密钥就可以生产程序集,不再需要私有密钥,这种用公有密钥生产的程序集还被允许放在GAC的内部结构中。如果没有用私有密钥对这些文件签名,它们将失去篡改保护功能,因为程序集文件没有经过散列转换,也没有在文件中嵌入数字签名。但是,失去保护不应该成为一个问题,因为我们是在开发程序集,而不是在打包或部署。
使用延迟签名一般使用如下技巧:
1. 当开发程序集时,首先取得仅包含公司公有密钥的文件,并将下面两个特性加到源代码中:
[assembly:AssemblyKeyFile(“MyCompanyPublicKey.keys”)]
[assembly:AssemblyDelaySign(true)]
这将告诉生成工具,我们希望对程序集进行延迟签名,也就是说我们不再提供私有密钥。
当编译器或者AL.exe检测到我们正在对程序集进行延迟签名时,它会为该程序集产生一个AssemblyDef清单条目并将程序集的公有密钥包含在其中。另外,公有密钥的存在也允许我们将程序集放在GAC中。我们还可以生成引用这些程序集的其它程序集,引用程序集将在其AssemblyRef元数据表的条目中包含正确的公有密钥。当生成最终的程序集时,得到的PE文件中将会为RSA数字签名留出一定的空间(一些使用工具可以根据公有密钥的大小判断出需要的空间)。
2.生成程序集后,如果试图直接向GAC安装程序集将会失败,因为文件内容还没有经过散列转换(相当于文件被篡改),为了将程序集安装到GAC中,我们必须阻止系统对程序集进行完整性验证。执行下面的命令以便后面跳过对其内任何文件的散列值的检查,将该程序集安装到GAC中,或者生成引用该程序集的其它程序集,以及测试该程序集。注意该操作只能执行一次,没有必要每次生成程序集时都执行一遍。
SN.exe -Vr MyAssembly.dll
3.一旦完成开发和测试,我们就需要正式地为程序集进行签名以实施打包盒部署。当准备打包盒部署程序集时,取得公司的公钥/私钥对,然后执行下面的命令:
SN.exe -R MyAssembly.dll MyCompany.keys
该命令行开关-R会使SN.exe对文件内容进行散列转换,并以私有密钥进行签名,然后将RSA数字签名嵌入到文件中原来预留出的空间。
4.执行下面的命令,恢复验证过程:
SN.exe -Vu MyAssmbly.dll