在 Windows 上使用 IIS 和 CNG 进行 AWS CloudHSM SSL/TLS 分载 - AWS CloudHSM

在 Windows 上使用 IIS 和 CNG 进行 AWS CloudHSM SSL/TLS 分载

本教程提供了有关在 Windows Web 服务器上使用借助 AWS CloudHSM 进行 SSL/TLS 分载的分步说明。

概述

在 Windows 上,Internet Information Services (IIS) for Windows Server Web 服务器应用程序本机支持 HTTPS。适用于 Microsoft 的“加密 API:下一代”(CNG) 的 AWS CloudHSM 密钥存储提供程序 (KSP) 提供了一个接口,该接口允许 IIS 使用您的群集中的 HSM 进行加密分载和密钥存储。AWS CloudHSM KSP 是连接 IIS 和 AWS CloudHSM 群集的桥梁。

本教程介绍如何执行以下操作:

  • 在 Amazon EC2 实例上安装 Web 服务器软件。

  • 使用存储在您的 AWS CloudHSM 集群中的私有密钥将 Web 服务器软件配置为支持 HTTPS。

  • (可选)使用 Amazon EC2 创建第二个 Web 服务器实例,并使用 Elastic Load Balancing 创建负载均衡器。使用负载均衡器可以在多台服务器中分配负载,从而提高性能。它还能在一台或多台服务器发生故障的情况下提供冗余和更高的可用性。

在您准备好开始使用后,请转到 步骤 1:设置先决条件

步骤 1:设置先决条件

要设置 Web 服务器借助 AWS CloudHSM 进行 SSL/TLS 分载,您需要满足以下条件:

  • 一个带至少一个 HSM 的活动 AWS CloudHSM 群集。

  • 一个运行已安装以下软件的 Windows 操作系统的 Amazon EC2 实例:

    • 适用于 Windows 的 AWS CloudHSM 客户端软件。

    • Internet Information Services (IIS) for Windows Server。

  • 一个加密用户(CU),该用户拥有和管理 HSM 上的 Web 服务器的私有密钥。

注意

本教程使用的是 Microsoft Windows Server 2016。还支持 Microsoft Windows Server 2012,但不支持 Microsoft Windows Server 2012 R2。

在 HSM 上设置 Windows Server 实例并创建 CU
  1. 完成入门中的步骤。启动 Amazon EC2 客户端时,选择 Windows Server 2016 或 Windows Server 2012 AMI。完成这些步骤后,您有一个至少包含一个 HSM 的活动集群。您还有运行 Windows Server 操作系统的 Amazon EC2 实例,其中安装有适用于 Windows 的 AWS CloudHSM 客户端软件。

  2. (可选) 向您的集群添加更多 HSM。有关更多信息,请参阅 向 AWS CloudHSM 集群添加 HSM

  3. 连接到您的 Windows Server。有关详细信息,请参阅《Amazon EC2 用户指南》中的连接到您的实例

  4. 使用 CloudHSM CLI 创建加密用户(CU)。跟踪 CU 用户名和密码。您需要这些信息才能完成下一步。

    注意

    有关创建用户的信息,请参阅使用 CloudHSM CLI 管理 HSM 用户

  5. 使用您在上一步中创建的 CU 用户名和密码设置 HSM 的登录凭证

  6. 在步骤 5 中,如果您使用 Windows Credentials Manager 来设置 HSM 凭证,请从 SysInternals 下载 psexec.exe,并以 NT Authority\SYSTEM 身份运行以下命令:

    psexec.exe -s "C:\Program Files\Amazon\CloudHsm\tools\set_cloudhsm_credentials.exe" --username <USERNAME> --password <PASSWORD>

    <USERNAME><PASSWORD> 替换为 HSM 凭证。

在您的 Windows Server 上安装 IIS
  1. 如果您尚未完成此操作,请连接到您的 Windows 服务器。有关详细信息,请参阅《Amazon EC2 用户指南》中的连接到您的实例

  2. 在 Windows 服务器上,启动服务器管理器

  3. 服务器管理器控制面板中,选择添加角色和功能

  4. 阅读开始之前信息,然后选择下一步

  5. 对于安装类型,选择基于角色或基于功能的安装。然后选择下一步

  6. 对于服务器选择,选择从服务器池中选择服务器。然后选择下一步

  7. 对于服务器角色,请执行以下操作:

    1. 选择 Web 服务器(IIS)

    2. 对于添加 Web Server (IIS) 所需的功能,选择添加功能

    3. 选择下一步完成选择服务器角色。

  8. 对于功能,接受默认值。然后选择下一步

  9. 阅读 Web 服务器角色(IIS) 信息。然后选择下一步

  10. 对于选择角色服务,接受默认值或根据偏好更改设置。然后选择下一步

  11. 对于确认,阅读确认信息。然后选择安装

  12. 安装完成后,选择关闭

完成这些步骤后,请转到 步骤 2:创建证书签名请求 (CSR) 和证书

步骤 2:创建证书签名请求 (CSR) 和证书

要启用 HTTPS,您的 Web 服务器和 SSL/TLS 证书需要一个相应的私有密钥。要使用借助 AWS CloudHSM 进行 SSL/TLS 分载的功能,请将私有密钥存储在 AWS CloudHSM 群集的 HSM 中。为此,您可使用适用于 Microsoft 的加密 API:下一代 (CNG) 的 AWS CloudHSM 密钥存储提供程序 (KSP) 来创建证书签名请求 (CSR)。然后,您向证书颁发机构 (CA) 提供 CSR,该机构负责签署 CSR 以生成证书。

创建 CSR

在 Windows Server 上使用 AWS CloudHSM KSP 创建 CSR。

创建 CSR
  1. 如果您尚未完成此操作,请连接到您的 Windows 服务器。有关详细信息,请参阅《Amazon EC2 用户指南》中的连接到您的实例

  2. 使用以下命令启动 AWS CloudHSM 客户端进程守护程序。

    Amazon Linux
    $ sudo start cloudhsm-client
    Amazon Linux 2
    $ sudo service cloudhsm-client start
    CentOS 7
    $ sudo service cloudhsm-client start
    CentOS 8
    $ sudo service cloudhsm-client start
    RHEL 7
    $ sudo service cloudhsm-client start
    RHEL 8
    $ sudo service cloudhsm-client start
    Ubuntu 16.04 LTS
    $ sudo service cloudhsm-client start
    Ubuntu 18.04 LTS
    $ sudo service cloudhsm-client start
    Windows
    • 对于 Windows 客户端 1.1.2 以上版本:

      C:\Program Files\Amazon\CloudHSM>net.exe start AWSCloudHSMClient
    • 对于 Windows 客户端 1.1.1 及更低版本:

      C:\Program Files\Amazon\CloudHSM>start "cloudhsm_client" cloudhsm_client.exe C:\ProgramData\Amazon\CloudHSM\data\cloudhsm_client.cfg
  3. 在您的 Windows Server 上,使用文本编辑器创建一个名为 IISCertRequest.inf 的证书请求文件。以下显示了示例 IISCertRequest.inf 文件的内容。有关可在文件中指定的各部分、键和值,请参阅 Microsoft 的文档。请勿更改 ProviderName 值。

    [Version] Signature = "$Windows NT$" [NewRequest] Subject = "CN=example.com,C=US,ST=Washington,L=Seattle,O=ExampleOrg,OU=WebServer" HashAlgorithm = SHA256 KeyAlgorithm = RSA KeyLength = 2048 ProviderName = "Cavium Key Storage Provider" KeyUsage = 0xf0 MachineKeySet = True [EnhancedKeyUsageExtension] OID=1.3.6.1.5.5.7.3.1
  4. 使用 Windows certreq 命令来从您在上一步中创建的 IISCertRequest.inf 文件创建 CSR。以下示例将 CSR 保存至名为 IISCertRequest.csr 的文件。如果您为证书请求文件使用了不同的文件名,请使用适当的文件名替换 IISCertRequest.inf。您可以为您的 CSR 文件选择使用不同的文件名替换 IISCertRequest.csr

    C:\>certreq -new IISCertRequest.inf IISCertRequest.csr SDK Version: 2.03 CertReq: Request Created

    IISCertRequest.csr 文件包含您的 CSR。您需要此 CSR 才能获取签名证书。

获取签名证书并导入

在生产环境中,您通常使用证书颁发机构 (CA) 通过 CSR 创建证书。测试环境无需 CA。如果您确实使用了一个 CA,请向它发送 CSR 文件 (IISCertRequest.csr) 并使用该 CA 创建已签名的 SSL/TLS 证书。

作为使用 CA 的替代方案,您可以使用 OpenSSL 等工具创建自签名证书。

警告

自签名证书不受浏览器的信任,不应在生产环境中使用。它们可在测试环境中使用。

以下过程演示了如何创建自签名证书并使用该证书来签署您的 Web 服务器的 CSR。

创建自签名证书
  1. 使用以下 OpenSSL 命令创建私有密钥。您可以选择将 SelfSignedCA.key 替换为包含您的私有密钥的文件名。

    openssl genrsa -aes256 -out SelfSignedCA.key 2048 Generating RSA private key, 2048 bit long modulus ......................................................................+++ .........................................+++ e is 65537 (0x10001) Enter pass phrase for SelfSignedCA.key: Verifying - Enter pass phrase for SelfSignedCA.key:
  2. 使用以下 OpenSSL 命令,通过您在上一步中创建的私有密钥创建自签名证书。这是一个交互式命令。阅读屏幕上的说明,并按照提示操作。将 SelfSignedCA.key 替换为包含您的私有密钥的文件的名称(如果不同)。您可以选择将 SelfSignedCA.crt 替换为包含您的自签名证书的文件名。

    openssl req -new -x509 -days 365 -key SelfSignedCA.key -out SelfSignedCA.crt Enter pass phrase for SelfSignedCA.key: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]: State or Province Name (full name) [Some-State]: Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []: Email Address []:
使用您的自签名证书签署 Web 服务器的 CSR
  • 使用以下 OpenSSL 命令,通过您的私有密钥和自签名证书签署 CSR。将以下文件替换为包含相应数据的文件的名称(如果不同)。

    • IISCertRequest.csr – 包含您的 Web 服务器 CSR 的文件的名称

    • SelfSignedCA.crt – 包含您的自签名证书的文件的名称

    • SelfSignedCA.key – 包含您的私有密钥的文件的名称

    • IISCert.crt – 包含您的 Web 服务器签名证书的文件的名称

    openssl x509 -req -days 365 -in IISCertRequest.csr \ -CA SelfSignedCA.crt \ -CAkey SelfSignedCA.key \ -CAcreateserial \ -out IISCert.crt Signature ok subject=/ST=IIS-HSM/L=IIS-HSM/OU=IIS-HSM/O=IIS-HSM/CN=IIS-HSM/C=IIS-HSM Getting CA Private Key Enter pass phrase for SelfSignedCA.key:

在完成上一步后,您会有一个用于 Web 服务器的签名证书 (IISCert.crt) 和一个自签名证书 (SelfSignedCA.crt)。在具有这些文件后,请转到步骤 3:配置 Web 服务器

步骤 3:配置 Web 服务器

将您的 IIS 网站的配置更新为使用在上一步结束时创建的 HTTPS 证书。这将完成 Windows Web 服务器软件 (IIS) 的设置,以便借助 AWS CloudHSM 进行 SSL/TLS 分载。

如果您使用了自签名证书签署 CSR,则必须首先将自签名证书导入 Windows 受信任的根证书颁发机构。

将您的自签名证书导入 Windows 受信任的根证书颁发机构
  1. 如果您尚未完成此操作,请连接到您的 Windows 服务器。有关详细信息,请参阅《Amazon EC2 用户指南》中的连接到您的实例

  2. 将您的自签名证书复制到 Windows Server。

  3. 在 Windows Server 上,打开 Control Panel (控制面板)

  4. 对于搜索控制面板,键入 certificates。然后选择管理计算机证书

  5. 证书 - 本地计算机窗口中,双击受信任的根证书颁发机构

  6. 右键单击证书,然后选择所有任务导入

  7. 证书导入向导 中,选择下一步

  8. 选择浏览,然后找到并选择您的自签名证书。如果按照本教程的上一步中的说明创建了您的自签名证书,则您的自签名证书将命名为 SelfSignedCA.crt。选择打开

  9. 选择下一步

  10. 对于证书存储,选择将所有证书置于以下存储中。然后,确保针对证书存储选中受信任的根证书颁发机构

  11. 选择下一步,然后选择完成

更新 IIS 网站的配置
  1. 如果您尚未完成此操作,请连接到您的 Windows 服务器。有关详细信息,请参阅《Amazon EC2 用户指南》中的连接到您的实例

  2. 启动 AWS CloudHSM 客户端进程守护程序。

  3. 将您在本教程的上一步中创建的 Web 服务器的签名证书复制到您的 Windows 服务器。

  4. 在您的 Windows Server 上,使用 Windows certreq 命令接受此签名证书,如以下示例所示。将 IISCert.crt 替换为包含您的 Web 服务器的签名证书的文件的名称。

    C:\>certreq -accept IISCert.crt SDK Version: 2.03
  5. 在 Windows 服务器上,启动服务器管理器

  6. 服务器管理器控制面板的右上角,选择工具Internet Information Services (IIS)管理器

  7. Internet Information Services (IIS)管理器窗口中,双击您的服务器名称。然后双击网站。选择您的网站。

  8. 选择 SSL 设置。然后,在窗口左侧选择绑定

  9. 网站绑定 窗口中,选择添加

  10. 对于类型,选择 https。对于 SSL 证书,选择您在本教程的上一步结束时创建的 HTTPS 证书。

    注意

    如果您在该绑定证书的过程中遇到错误,请重新启动服务器并重试此步骤。

  11. 选择确定

在更新您的网站配置后,请转到步骤 4:启用 HTTPS 流量并验证证书

步骤 4:启用 HTTPS 流量并验证证书

通过 AWS CloudHSM 配置用于 SSL/TLS 分流的服务器后,将您的 web 实例添加至允许入站 HTTPS 流量的安全组。Web 浏览器等客户端可通过 Web 服务器创建 HTTPS 连接。然后与您的 Web 服务器建立 HTTPS 连接,并确认它使用的是 AWS CloudHSM SSL/TLS 分流配置的证书。

启用入站 HTTPS 连接

要从客户端 (如 Web 浏览器) 连接到您的 Web 服务器,请创建一个允许入站 HTTPS 连接的安全组。具体来说,它应允许端口 443 上的入站 TCP 连接。将此安全组分配给您的网络服务器。

为 HTTPS 创建安全组并将其分配给您的网络服务器
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格中,选择安全组

  3. 选择创建安全组

  4. 对于创建安全组,执行以下操作:

    1. 对于安全组名称,键入您要创建的安全组的名称。

    2. (可选) 键入对您要创建的安全组的描述。

    3. 对于 VPC,选择包含您的 Web 服务器 Amazon EC2 实例的 VPC。

    4. 选择添加规则

    5. 对于类型,从下拉窗口中选择 HTTPS

    6. 对于来源,输入来源位置。

    7. 选择创建安全组

  5. 在导航窗格中,选择实例

  6. 选中您的 Web 服务器实例旁边的复选框。

  7. 在页面顶部选择操作下拉菜单。选择安全,然后选择更改安全组

  8. 对于关联安全组,请选择搜索框,然后选择您为 HTTPS 创建的安全组。然后选择添加安全组

  9. 选择保存

验证 HTTPS 使用的是您已配置的证书

将 Web 服务器添加到安全组后,就可以验证 SSL/TLS 分载是否使用了自签名证书。您可以使用网络浏览器或使用工具 (如 OpenSSL s_client) 执行此操作。

使用网络浏览器验证 SSL/TLS 分载
  1. 使用 Web 浏览器连接到采用服务器的公共 DNS 名称或 IP 地址的 Web 服务器。确保地址栏中的 URL 以 https:// 开头。例如,https://ec2-52-14-212-67.us-east-2.compute.amazonaws.com/

    提示

    您可以使用 DNS 服务 (如 Amazon Route 53) 将网站域名 (例如,https://www.example.com/) 路由到您的 Web 服务器。有关更多信息,请参阅 《Amazon Route 53 开发人员指南》或 DNS 服务文档中的将流量路由到 Amazon EC2 实例

  2. 使用您的 Web 浏览器查看 Web 服务器证书。有关更多信息,请参阅下列内容:

    • 对于 Mozilla Firefox,请参阅 Mozilla Support 网站上的查看证书

    • 关于 Google Chrome 浏览器,请参阅 Google Tools for Web Developers 网站上的了解安全问题

    其他网络浏览器可能具有相似的功能,可使用这些功能来查看网络服务器证书。

  3. 确保 SSL/TLS 证书是您配置 Web 服务器使用的证书。

使用 OpenSSL s_client 验证 SSL/TLS 分载
  1. 运行以下 OpenSSL 命令以通过 HTTPS 连接到您的 Web 服务器。将 <server name> 替换为您的 Web 服务器的公有 DNS 名称或 IP 地址。

    openssl s_client -connect <server name>:443
    提示

    您可以使用 DNS 服务 (如 Amazon Route 53) 将网站域名 (例如,https://www.example.com/) 路由到您的 Web 服务器。有关更多信息,请参阅 《Amazon Route 53 开发人员指南》或 DNS 服务文档中的将流量路由到 Amazon EC2 实例

  2. 确保 SSL/TLS 证书是您配置 Web 服务器使用的证书。

您现在有一个通过 HTTPS 保护的网站。网络服务器的私有密钥存储在 AWS CloudHSM 集群的 HSM 中。

若要添加负载均衡器,请参阅 使用 Elastic Load Balancing 为 AWS CloudHSM 添加负载均衡器(可选)