程序集签名示例

以下示例讨论了如何生成由程序集清单、验证目录和程序集文件组成的已签名的并行程序集。 应对共享并行程序集进行签名。 操作系统在将共享程序集安装到全局并行存储 (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 的行业标准格式。

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