

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用微软 SignTool 和客户端 SDK 3 签署文件
<a name="signtool-sdk3"></a>

在加密和公有密钥基础结构 (PKI) 中，数字签名用于确认数据已由可信实体发送。签名还表明数据在传输过程中未被篡改。签名是使用发送方的私有密钥生成的加密哈希。接收方可以通过使用发送方的公有密钥解密其哈希签名来验证数据的完整性。反过来，发送方有责任维护数字证书。数字证书显示发送方对私有密钥的所有权，并向接收方提供解密所需的公有密钥。只要私钥归发件人所有，签名就可以被信任。 AWS CloudHSM 提供安全的 FIPS 140-2 3 级验证硬件，让您可以通过独家单租户访问来保护这些密钥。

许多组织使用 Microsoft SignTool（一种命令行工具）来签名、验证文件并给文件加上时间戳，以简化代码签名过程。您可以使用安全 AWS CloudHSM 地存储密钥对，直到需要它们为止 SignTool，从而创建易于自动化的签名数据工作流程。

以下主题概述了如何 SignTool 与一起使用 AWS CloudHSM。

**Topics**
+ [步骤 1：设置先决条件](#signtool-sdk3-prereqs)
+ [步骤 2：创建签名请求](#signtool-sdk3-csr)
+ [步骤 3：对文件进行签名](#signtool-sdk3-sign)

## 步骤 1：设置先决条件
<a name="signtool-sdk3-prereqs"></a>

要将 Microsoft SignTool 与配合使用 AWS CloudHSM，你需要满足以下条件：
+ 一个运行 Windows 操作系统的 Amazon EC2 客户端实例。
+ 一个证书颁发机构 (CA)，自我维护或由第三方提供商建立。
+ 与您的 EC2 AWS CloudHSM 实例位于同一个虚拟公有云 (VPC) 中的活动集群。该集群必须包含至少一个 HSM。
+ 在 AWS CloudHSM 集群中拥有和管理密钥的加密用户 (CU)。
+ 未签名文件或可执行文件。
+ Microsoft Windows 软件开发工具包 (SDK)。

**设置在 Windows 中使用的 AWS CloudHSM 先决条件 SignTool**

1. 按照本指南的[入门](getting-started.md)部分中的说明进行操作，启用 Windows EC2 实例和 AWS CloudHSM 集群。

1. 如果你想托管自己的 Windows Server CA，请按照[将 Windows 服务器配置为证书颁发机构中的步骤 1 和 2 进行](win-ca-overview-sdk3.md)操作 AWS CloudHSM。否则，请继续使用您的公开可信的第三方 CA。

1. 在 Windows EC2 实例上下载并安装下列版本的 Microsoft Windows 开发工具包之一：
   + [Microsoft Windows 开发工具包 10](https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk)
   + [Microsoft Windows 开发工具包 8.1](https://developer.microsoft.com/en-us/windows/downloads/windows-8-1-sdk)
   + [Microsoft Windows 开发工具包 7](https://www.microsoft.com/en-us/download/details.aspx?id=8279)

   `SignTool` 可执行文件是 Windows SDK Signing Tools for Desktop Apps 安装功能的一部分。您可以省略要安装的其他功能（如果您不需要它们）。默认安装位置是：

   ```
   C:\Program Files (x86)\Windows Kits\<SDK version>\bin\<version number>\<CPU architecture>\signtool.exe
   ```

现在，你可以使用 Microsoft Windows SDK、你的 AWS CloudHSM 集群和你的 CA 来[创建签名证书](#signtool-sdk3-csr)。

## 步骤 2：创建签名请求
<a name="signtool-sdk3-csr"></a>

现在您已将 Windows 开发工具包下载到 EC2 实例，您可以使用它来生成证书签名请求 (CSR)。CSR 是未签名的证书，该证书最终将传递给您的 CA 进行签名。在此示例中，我们使用 Windows 开发工具包中包含的 `certreq` 可执行文件来生成 CSR。

**使用 `certreq` 可执行文件生成 CSR**

1. 如果您尚未完成此操作，请连接到您的 Windows EC2 实例。有关详细信息，请参阅《*Amazon EC2 用户指南*》中的[连接到您的实例](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/EC2_GetStarted.html#ec2-connect-to-instance-windows)。

1. 创建一个名为 `request.inf` 的文件，其中包含下列行。将 `Subject` 信息替换为该组织的相应信息。有关每个参数的说明，请参阅 [Microsoft 的文档](https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/certreq_1#BKMK_New)。

   ```
   [Version]
   Signature= $Windows NT$
   [NewRequest]
   Subject = "C=<Country>,CN=<www.website.com>,O=<Organization>,OU=<Organizational-Unit>,L=<City>,S=<State>"
   RequestType=PKCS10
   HashAlgorithm = SHA256
   KeyAlgorithm = RSA
   KeyLength = 2048
   ProviderName = "Cavium Key Storage Provider"
   KeyUsage = "CERT_DIGITAL_SIGNATURE_KEY_USAGE"
   MachineKeySet = True
   Exportable = False
   ```

1. 运行 `certreq.exe`。在此示例中，我们将 CSR 保存为 `request.csr`。

   ```
   certreq.exe -new request.inf request.csr
   ```

   在内部，将在您的 AWS CloudHSM 集群上生成一个新的密钥对，该密钥对的私钥用于创建 CSR。

1. 将 CSR 提交给 CA。如果您使用的是 Windows Server CA，请执行以下步骤：

   1. 输入以下命令以打开 CA 工具：

      ```
      certsrv.msc
      ```

   1. 在新窗口中，右键单击 CA 服务器的名称。选择**所有任务**，然后选择**提交新请求**。

   1. 导航到 `request.csr` 的位置，然后选择**打开**。

   1. 展开**服务器 CA** 菜单，导航至**待处理请求**文件夹。右键单击您刚刚创建的请求，并在**所有任务**下，选择 **Issue** (发布)。

   1. 现在，导航到**颁发的证书**文件夹（位于**待处理请求**文件夹上）。

   1. 选择**打开**以查看证书，然后选择**详细信息**选项卡。

   1. 选择**复制到文件**以启动证书导出向导。将经 DER 编码的 X.509 文件作为 `signedCertificate.cer` 保存到安全位置。

   1. 退出 CA 工具并使用以下命令，该命令将证书文件移动到 Windows 中的个人证书存储。然后，它可由其他应用程序使用。

      ```
      certreq.exe -accept signedCertificate.cer
      ```

现在，您可以使用导入的证书来[签署文件](#signtool-sdk3-sign)。

## 步骤 3：对文件进行签名
<a name="signtool-sdk3-sign"></a>

现在，您可以使用导入 SignTool 的证书来签署示例文件。为此，您需要知道证书的 SHA-1 哈希或*指纹*。指纹用于确保 SignTool仅使用经过验证的 AWS CloudHSM证书。在此示例中，我们使用 PowerShell 获取证书的哈希值。您还可以使用 CA 的 GUI 或 Windows 开发工具包的 `certutil` 可执行文件。

**获取证书的指纹并使用它来对文件进行签名**

1. 以管理员 PowerShell 身份打开并运行以下命令：

   ```
   Get-ChildItem -path cert:\LocalMachine\My
   ```

   复制返回的 `Thumbprint`。  
![\[证书的哈希将作为指纹返回\]](http://docs.aws.amazon.com/zh_cn/cloudhsm/latest/userguide/images/signtool-hash.png)

1. 导航到其中包含 PowerShell 的目录`SignTool.exe`。默认位置是 `C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x64`。

1. 最后，通过运行以下命令来对文件签名。如果命令成功，则 PowerShell 返回成功消息。

   ```
   signtool.exe sign /v /fd sha256 /sha1 <thumbprint> /sm C:\Users\Administrator\Desktop\<test>.ps1
   ```  
![\[已对 .ps1 文件成功签名。\]](http://docs.aws.amazon.com/zh_cn/cloudhsm/latest/userguide/images/signtool-last-command.png)

1. （可选）要验证文件上的签名，请使用以下命令：

   ```
   signtool.exe verify /v /pa C:\Users\Administrator\Desktop\<test>.ps1
   ```