完成测试签名并验证驱动程序是否已准备好发布后,驱动程序包必须进行发布签名。 有两种发布签名驱动程序包的方法。
发布签名标识加载到 Windows 的内核模式或用户模式二进制文件(例如,.sys 或 .dll 文件)的发布者。
内核模式二进制文件通过以下任一方式进行发布签名:
Windows 硬件质量实验室 (WHQL) 发布签名驱动程序包。 WHQL 发布签名是通过 Windows 认证计划获取的。 Windows 硬件兼容性计划认证流程描述了 Windows 认证计划从头到尾的五个步骤。 如有任何问题,请联系合作伙伴中心仪表板技术支持。
驱动程序包可以由驱动程序开发人员和供应商发布签名,而不是使用 WHQL 计划。 发布签名是通过软件发布者证书 (SPC) 创建的。 SPC 是从 Microsoft 授权的证书颁发机构 (CA) 获取的。 使用此类型的 SPC 生成的签名也符合 Windows 的 PnP 驱动程序签名要求。
以下是为方法 2 发布签名驱动程序包所需的步骤:
获取软件发布者证书 (SPC)
发布签名需要一个代码签名证书,也称为商业 CA 中的软件发布者证书 (SPC)。
内核模式代码签名的交叉证书一文提供了商业 Microsoft 授权证书颁发机构 (CA) 的列表。 必须使用列出的 CA 供应商提供软件发布者证书 (SPC) 来发布和签名驱动程序包。
按照 CA 的说明获取 SPC,并在签名计算机上安装私钥。 SPC 是驱动程序供应商的专有工具,要求其签名其驱动程序包。 SPC、私钥和密码不得与请求供应商组织外部的任何人共享。
交叉证书
软件发行者证书摘录:
除了获取 SPC 之外,还必须获取由 Microsoft 颁发的交叉证书。 交叉证书用于验证颁发 SPC 的 CA 是否为受信任的根颁发机构。 跨证书是由 CA 颁发的 X.509 证书,用于对另一个 CA 的根证书的公钥进行签名。 交叉证书允许系统拥有一个受信任的 Microsoft 根颁发机构,但也提供了将信任链扩展到颁发 SPC 的商业证书颁发机构 (CA) 的灵活性。
发布者无需使用驱动程序包分发交叉证书。 跨证书包含在驱动程序包目录文件的数字签名或嵌入在驱动程序文件中的签名中。 安装驱动程序包的用户无需执行因使用交叉证书而导致的任何额外配置步骤。
内核模式代码签名的交叉证书中的精选摘录:
跨证书是由一个证书颁发机构 (CA) 颁发的数字证书,用于对另一个证书机构的根证书的公钥进行签名。 交叉证书提供了一种从单个受信任根 CA 到多个其他 CA 创建信任链的方法。
在 Windows 中,交叉证书:
- 允许操作系统内核具有单个受信任的 Microsoft 根颁发机构。
- 将信任链扩展到颁发软件发布者证书 (SPC) 的多个商业 CA,这些证书用于在 Windows 上分发、安装和加载代码签名软件
此处提供的交叉证书与 Windows 驱动程序工具包 (WDK) 代码签名工具一起使用,用于正确对内核模式软件进行签名。 对内核模式软件进行数字签名类似于对为 Windows 发布的任何软件进行代码签名。 开发人员或软件发布者商在对内核模式软件进行签名时,会在数字签名中添加交叉证书。 代码签名工具将交叉证书添加到二进制文件或目录的数字签名。
选择正确的交叉证书
Microsoft 为每个 CA 提供一个特定的交叉证书,用于为代码签名内核模式代码颁发 SPC。 有关交叉证书的详细信息,请参阅内核模式代码签名的交叉证书。 本文列出了 Microsoft 授权 CA 供应商的名称,以及颁发 SPC 的根机构的正确交叉证书。 找到 CA 供应商为 SPC 颁发的正确交叉证书,将交叉证书下载到用于发布签名的签名计算机,并将其存储在驱动程序目录中。 在任何签名命令中使用此证书时,请提供其绝对路径。
在个人证书存储中安装 SPC 信息
软件发布者证书的进一步摘录:
若要使用 SPC 以符合内核模式代码签名策略的方式对驱动程序进行签名,证书信息必须首先包含在个人信息交换 (.pfx) 文件中。 然后,必须将 .pfx 文件中包含的信息添加到对驱动程序进行签名的本地计算机的个人证书存储中。
CA 可能会颁发包含所需证书信息的 .pfx 文件。 如果是这样,可以按照 在个人证书存储中安装 .pfx 文件中所述的说明,将 .pfx 文件添加到个人证书存储。
但是,CA 可能会颁发以下文件对:
- 包含私钥信息的 .pvk 文件。
- 包含公钥信息的 .spc 或 .cer 文件。
在这种情况下,必须将文件对(.pvk 和 .spc,或 .pvk 和 .cer)转换为 .pfx 文件,才能将证书信息添加到个人证书存储。
要从 CA 颁发的文件对创建一个 .pfx 文件,请按照以下说明操作:
若要将 .pvk 文件和 .spc 文件转换为 .pfx 文件,请在命令提示符处使用以下 Pvk2Pfx 命令:
Pvk2Pfx -pvk mypvkfile.pvk -pi mypvkpassword -spc myspcfile.spc -pfx mypfxfile.pfx -po pfxpassword -f若要将 .pvk 文件和 .cer 文件转换为 .pfx 文件,请在命令提示符处使用以下 Pvk2Pfx 命令:
Pvk2Pfx -pvk mypvkfile.pvk -pi mypvkpassword -spc mycerfile.cer -pfx mypfxfile.pfx -po pfxpassword -f
下面介绍了 Pvk2Pfx 命令中使用的参数:
- -pvkmypvkfile.pvk 参数指定 .pvk 文件。
- -pimypvkpassword 选项指定 .pvk 文件的密码。
- -spcmyspcfile.spc 参数指定 .spc 文件,或 -spcmycerfile.cer 参数指定 .cer 文件。
- -pfxmypfxfile.pfx 选项指定 .pfx 文件的名称。
- -popfxpassword 选项指定 .pfx 文件的密码。
- -f 选项将 Pvk2Pfx 配置为替换现有的 .pfx 文件(如果存在)。
重要
应使用强密码保护 pvk 和 pfx 文件。
在个人证书存储中安装 .pfx 文件
对于对内核模式驱动程序进行签名,必须将存储在 .pfx 文件中的证书和密钥导入到本地个人证书存储中。 Signtool 不支持将 .pfx 文件用于对内核模式驱动程序进行签名。 该限制是由于在使用 .pfx 文件中的证书时,在签名中添加交叉证书时发生冲突造成的
软件发布者证书的最终摘录:
从 CA 获取 .pfx 文件,或从 .pvk 和 .spc 或 .cer 创建 .pfx 文件后,将 .pfx 文件中的信息添加到对驱动程序进行签名的本地计算机的个人证书存储中。 可以使用证书导入向导将 .pfx 文件中的信息导入到个人证书存储,如下所示:
- 若要打开证书导入向导,请在 Windows 资源管理器中找到 .pfx 文件,然后双击该文件。
- 若要将代码签名证书导入到个人证书存储中,请按照证书导入向导中的过程操作。
来自将 SPC 导入证书存储的摘录:
将 .pfx 文件导入本地个人证书存储的替代方法是使用 CertUtil 命令行实用工具。 以下命令行示例使用 CertUtil 将 abc.pfx 文件导入到个人证书存储中:
certutil -user -p pfxpassword -importPFX abc.pfx
其中:
- -user 选项指定“当前用户”个人存储。
- The -p 选项指定 .pfx 文件的密码 (pfxpassword)。
- -importPFX 选项指定 .pfx 文件的名称 (abc.pfx)。
查看 SPC 属性
使用 MMC 证书管理单元 (certmgr.msc) 查看个人证书存储中的证书。
- 启动证书管理单元 certmgr.msc。
- 在管理单元的左窗格中选择“个人证书存储”文件夹。
- 选择“证书”文件夹,然后双击用于发布签名的证书。
- 从字段列表中选择“使用者”,以在“证书”对话框的“详细信息”选项卡上突出显示证书的使用者名称。 本部分中的示例将此使用者名称与 Signtool 的 /n 参数一起使用。
签名
运行以下命令,对对驱动程序包进行签名的 cat 文件进行签名。 /n 命令应使用上面步骤 4 中“使用者”下看到的证书的带引号名称,如 CN= MyCompany Inc.
signtool sign /v /ac MSCV-VSClass3.cer /s My /n "MyCompany Inc." /t http://timestamp.digicert.com toaster.cat
/ac FileName
指定包含要添加到签名块的另一个证书的文件。 此文件是从 Microsoft 交叉证书下载链接获得的交叉签名证书 MSCV-VSClass3.cer。 如果交叉证书不在当前目录中,请使用完整路径名。 虽然不是必需的,但建议在签名 cat 文件时添加交叉证书。
/s StoreName
指定要在搜索证书时打开的存储。 如果未指定此选项,则会打开“我的存储”,即个人证书存储区。
/n SubjectName
指定签名证书的主题的名称。 该值可以是整个主题名称的子字符串。
/t URL
指定时间戳服务器的 URL。 如果此选项不存在,则签名的文件不会加时间戳。 使用时间戳时,签名的驱动程序包将无限期有效,直到出于其他原因吊销 SPC 签名证书。
必须正确执行每个签名步骤,否则无法对驱动程序进行签名。 你可能会看到以下错误。
SignTool Error: No certificates were found that met all the given criteria
嵌入签名
内核模式代码签名策略控制是否加载内核模式驱动程序。 与 32 位版本的 Windows 相比,64 位版本的 Windows 具有更严格的要求。
内核模式启动驱动程序必须具有嵌入式软件发布者证书 (SPC) 签名。 此要求适用于任何 PnP 或非 PnP 内核模式启动驱动程序。 也适用于 32 位版本的 Windows。 非引导启动驱动程序的 PnP 内核模式驱动程序必须具有嵌入式 SPC 签名、具有 WHQL 版本签名的目录文件或具有 SPC 签名的目录文件。
有关详细信息,请参阅内核模式代码签名要求。
用于嵌入对 toaster.sys 文件进行签名的命令。
signtool sign /v /ac MSCV-VSClass3.cer /s my /n "MyCompany Inc. " /t http://timestamp.digicert.com toaster.sys
签名完成后,运行以下命令以验证已签名的驱动程序。
signtool verify /kp /v /c tstamd64.cat toastpkg.inf
命令输出:
Verifying: toaster.inf
File is signed in catalog: toaster.cat
Hash of file (sha1): 580C2A24C3A9E12817E18ADF1C4FE9CF31B01EA3
Signing Certificate Chain:
Issued to: VeriSign Class 3 Public Primary Certification Authority - G5
Issued by: VeriSign Class 3 Public Primary Certification Authority - G5
Expires: Wed Jul 16 15:59:59 2036
SHA1 hash: 4EB6D578499B1CCF5F581EAD56BE3D9B6744A5E5
Issued to: VeriSign Class 3 Code Signing 2010 CA
Issued by: VeriSign Class 3 Public Primary Certification Authority - G5
Expires: Fri Feb 07 15:59:59 2020
SHA1 hash: 495847A93187CFB8C71F840CB7B41497AD95C64F
Issued to: Contoso, Inc
Issued by: VeriSign Class 3 Code Signing 2010 CA
Expires: Thu Dec 04 15:59:59 2014
SHA1 hash: EFC77FA6BA295580C2A2CD25B56C00606CA21269
The signature is timestamped: Mon Jan 27 14:48:55 2014
Timestamp Verified by:
Issued to: Thawte Timestamping CA
Issued by: Thawte Timestamping CA
Expires: Thu Dec 31 15:59:59 2020
SHA1 hash: BE36A4562FB2EE05DBB3D32323ADF445084ED656
Issued to: Symantec Time Stamping Services CA - G2
Issued by: Thawte Timestamping CA
Expires: Wed Dec 30 15:59:59 2020
SHA1 hash: 6C07453FFDDA08B83707C09B82FB3D15F35336B1
Issued to: Symantec Time Stamping Services Signer - G4
Issued by: Symantec Time Stamping Services CA - G2
Expires: Tue Dec 29 15:59:59 2020
SHA1 hash: 65439929B67973EB192D6FF243E6767ADF0834E4
Cross Certificate Chain:
Issued to: Microsoft Code Verification Root
Issued by: Microsoft Code Verification Root
Expires: Sat Nov 01 05:54:03 2025
SHA1 hash: 8FBE4D070EF8AB1BCCAF2A9D5CCAE7282A2C66B3
Issued to: VeriSign Class 3 Public Primary Certification Authority - G5
Issued by: Microsoft Code Verification Root
Expires: Mon Feb 22 11:35:17 2021
SHA1 hash: 57534CCC33914C41F70E2CBB2103A1DB18817D8B
Issued to: VeriSign Class 3 Code Signing 2010 CA
Issued by: VeriSign Class 3 Public Primary Certification Authority - G5
Expires: Fri Feb 07 15:59:59 2020
SHA1 hash: 495847A93187CFB8C71F840CB7B41497AD95C64F
Issued to: Contoso, Inc
Issued by: VeriSign Class 3 Code Signing 2010 CA
Expires: Thu Dec 04 15:59:59 2014
SHA1 hash: EFC77FA6BA295580C2A2CD25B56C00606CA21269
Successfully verified: toaster.inf
Number of files successfully Verified: 1
Number of warnings: 0
Number of errors: 0
请注意证书链中存在 Microsoft 代码验证根。
接下来,检查 toaster.sys 文件的嵌入签名。
signtool verify /v /kp toaster.sys
命令输出:
Verifying: toaster.sys Hash of file (sha1): CCF5F5C02FEDE87D92FCB7B536DBF5D5EFDB7B41
Signing Certificate Chain:
Issued to: VeriSign Class 3 Public Primary Certification Authority - G5
Issued by: VeriSign Class 3 Public Primary Certification Authority - G5
Expires: Wed Jul 16 15:59:59 2036
SHA1 hash: 4EB6D578499B1CCF5F581EAD56BE3D9B6744A5E5
Issued to: VeriSign Class 3 Code Signing 2010 CA
Issued by: VeriSign Class 3 Public Primary Certification Authority - G5
Expires: Fri Feb 07 15:59:59 2020
SHA1 hash: 495847A93187CFB8C71F840CB7B41497AD95C64F
Issued to: Contoso, Inc
Issued by: VeriSign Class 3 Code Signing 2010 CA
Expires: Thu Dec 04 15:59:59 2014 SHA1 hash: EFC77FA6BA295580C2A2CD25B56C00606CA21269
The signature is timestamped: Mon Jan 27 14:48:55 2014 Timestamp Verified by:
Issued to: Thawte Timestamping CA Issued by: Thawte Timestamping CA Expires: Thu Dec 31 15:59:59 2020 SHA1 hash: BE36A4562FB2EE05DBB3D32323ADF445084ED656
Issued to: Symantec Time Stamping Services CA - G2 Issued by: Thawte Timestamping CA Expires: Wed Dec 30 15:59:59 2020 SHA1 hash: 6C07453FFDDA08B83707C09B82FB3D15F35336B1
Issued to: Symantec Time Stamping Services Signer - G4 Issued by: Symantec Time Stamping Services CA - G2 Expires: Tue Dec 29 15:59:59 2020 SHA1 hash: 65439929B67973EB192D6FF243E6767ADF0834E4
Cross Certificate Chain:
Issued to: Microsoft Code Verification Root Issued by: Microsoft Code Verification Root Expires: Sat Nov 01 05:54:03 2025 SHA1 hash: 8FBE4D070EF8AB1BCCAF2A9D5CCAE7282A2C66B3
Issued to: VeriSign Class 3 Public Primary Certification Authority - G5
Issued by: Microsoft Code Verification Root
Expires: Mon Feb 22 11:35:17 2021
SHA1 hash: 57534CCC33914C41F70E2CBB2103A1DB18817D8B
Issued to: VeriSign Class 3 Code Signing 2010 CA
Issued by: VeriSign Class 3 Public Primary Certification Authority - G5
Expires: Fri Feb 07 15:59:59 2020
SHA1 hash: 495847A93187CFB8C71F840CB7B41497AD95C64F
Issued to: Contoso, Inc Issued by: VeriSign Class 3 Code Signing 2010 CA Expires: Thu Dec 04 15:59:59 2014 SHA1 hash: EFC77FA6BA295580C2A2CD25B56C00606CA21269
Successfully verified: toaster.sys
Number of files successfully Verified: 1 Number of warnings: 0 Number of errors: 0
同样,请注意证书链中存在 Microsoft 代码验证根。