程序集签名示例

以下示例讨论如何生成由程序集清单、验证目录和程序集文件组成的已签名并行程序集。 应对共享并行程序集进行签名。 操作系统先验证程序集签名,然后再将共享程序集安装到全局并行存储 (WinSxS) 。 这使得欺骗并行程序集的发布者变得困难。

请注意,在生成程序集目录后更改程序集文件或清单的内容会使目录和程序集失效。 如果在创建和签名目录后必须更新程序集文件或清单,则必须再次对程序集进行签名并生成新目录。

从程序集文件、程序集清单和用于对程序集进行签名的证书文件开始。 证书文件必须为 2048 位或更大。 无需使用受信任的证书。 证书仅用于验证程序集是否未损坏。

运行 Microsoft Windows 软件开发工具包 ( SDK) 中提供的Pktextract.exe实用工具,从证书文件中提取公钥令牌。 若要使 Pktextract 正常工作,证书文件必须与实用工具位于同一目录中。 使用提取的公钥令牌值更新清单文件中 assemblyIdentity 元素的 publicKeyToken 属性。

下面是名为 MySampleAssembly.manifest 的清单文件的示例。 MySampleAssembly 程序集仅包含一个文件,MYFILE.DLL。 请注意,assemblyIdentity 元素的 publicKeyToken 属性的值已使用公钥标记的值更新。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity 
        type="win32" 
        name="Microsoft.Windows.MySampleAssembly" 
        version="1.0.0.0" 
        processorArchitecture="x86"         
        publicKeyToken="0000000000000000"/>
    <file name="myfile.dll"/>
</assembly>

接下来运行 Windows SDK 中提供的 Mt.exe 实用工具。 程序集文件必须与清单位于同一目录中。 在此示例中,这是 MySampleAssembly 目录。 调用示例Mt.exe,如下所示:

C:\MySampleAssembly>mt.exe -manifest MySampleAssembly.manifest -hashupdate -makecdfs

下面是运行 Mt.exe 后示例清单的外观。 请注意,使用 hashupdate 选项运行 Mt.exe 会添加文件的 SHA-1 哈希。 请勿更改此值。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity 
        type="win32" 
        name=" Microsoft.Windows.MySampleAssembly" 
        version="1.0.0.0" 
        processorArchitecture="x86"         
        publicKeyToken="0000000000000000"/>
    <file name="myfile.dll"
hash="a1d362d6278557bbe965a684ac7adb4e57427a29" hashalg="SHA1"/>
</assembly>

使用 -makecdfs 选项运行Mt.exe将生成一个名为 MySampleAssembly.manifest.cdf 的文件,该文件描述将用于验证清单的安全目录的内容。

下一步是通过此 .cdf 运行Makecat.exe,为程序集创建安全目录。 此示例中对 Makecat.exe 的调用如下所示:

c:\MySampleAssembly>makecat MySampleAssembly.manifest.cdf

最后一步是运行 SignTool.exe,以使用证书对目录文件进行签名。 此证书应与前面用于生成公钥令牌的证书相同。 有关SignTool.exe请参阅 SignTool 主题。 对示例的 SignTool 的调用如下所示:

c:\MySampleAssembly>signtool sign /f <fullpath>mycompany.pfx /du https://www.mycompany.com/MySampleAssembly /t https://timestamp.digicert.com MySampleAssembly.cat

如果你有经过身份验证的数字证书,并且证书颁发机构使用 PVK 文件格式来存储私钥,则可以使用 PVK 数字证书文件导入程序 (pvkimprt.exe) 将密钥导入到加密服务提供商 (CSP) 。 此实用工具使你能够导出为 PFX/P12 的行业标准格式。 有关 PVK 数字证书文件导入程序的详细信息,请参阅 MSDN 库的部署资源部分或联系证书颁发机构。

另请参阅 创建签名文件和目录