使用 SSL 保护自定义网域

App Engine 应用的 SSL 支持超越了基本 SSL 的范围,可以提供全球分布式 SSL 端点和内置负载平衡,以安全、可靠且快速的方式向全球受众提供您的应用。

默认情况下,系统将自动使用托管式 SSL 证书对自定义网域启用 HTTPS 连接。当自定义网域映射到应用并且您配置了 DNS 记录后,App Engine 会提供托管式 SSL 证书,在证书到期之前处理证书续期事宜,并在您将自定义网域从应用中移除时撤消该证书。

准备工作

  • 确保您的 App Engine 项目已设置自定义网域

  • 如果您使用 Cloud Load Balancing 和无服务器 NEG 将流量路由到 App Engine 应用,我们建议您将自定义网域映射到负载平衡器,而不是直接映射到您的应用,并使用为负载平衡器创建的 SSL 证书。这样就无需为每个无服务器应用管理单独的 SSL 证书。此外,借助 Cloud Load Balancing,您可以设置 SSL 政策来控制负载平衡器与客户端协商的 SSL 的功能。如需了解详情,请参阅以下页面:

    请注意以下限制:

    • 我们建议您使用入站流量控制,以使应用仅接收从负载平衡器和 VPC(如果使用 VPC)发送的请求。否则,用户可以使用应用的 App Engine 网址来绕过负载平衡器、Google Cloud Armor 安全政策、SSL 证书和通过负载平衡器传递的私钥。

验证已预配代管式证书

设置自定义网域并更新 DNS 记录后,系统将在几分钟之内自动预配代管式 SSL 证书。代管式证书由 Google Trust Services (GTS) 或 Let's Encrypt 签名。

如需验证已预配证书,请执行以下操作:

  1. 在 Google Cloud Console 中,转到 App Engine > 设置 > 自定义网域

    转到“自定义网域”页面

  2. SSL 安全设置会显示为由 Google 管理

排查代管式 SSL 证书的问题

  • 您可能需要更新自定义网域的 DNS 记录以验证您的域名。App Engine 无法为未经验证的网域配置证书。

  • 您可以向 Admin API 发出 AuthorizedCertificate.GET 请求,以此检查证书的状态。

  • 如果由于 DNS 记录不可用而未预配代管式证书,则 ManagedCertificate.ManagementStatus 字段可能为 FAILED_RETRYING_NOT_VISIBLE。请验证您的 DNS 记录已更新为最新状态,然后等待几分钟再重试。DNS 记录最长可能需要等待 24 小时才可用。

  • 如果状态为 FAILED_PERMANENT,则表示所有续期尝试都已失败。请检查 DNS 设置,然后按照更新为托管式 SSL 证书中的步骤更新您的自定义网域映射。

升级为托管式 SSL 证书

在升级为 Google 托管式 SSL 证书之前,请注意,托管式证书不支持通配符映射。

如果您使用的是子网域,则每个基本网域每周最多可以有 20 个托管式证书。如果您达到了此限制,App Engine 会一直尝试颁发托管式证书,直到满足所有请求为止。

如需从您自己的 SSL 证书切换到 Google 管理的 SSL 证书,或者将代管式 SSL 证书添加到具有自定义网域的现有应用,请更新您的网域映射:

  1. 在 Google Cloud Console 中,转到 App Engine > 设置 > 自定义网域

    转到“自定义网域”页面

  2. 选择您要保护的网域,然后点击启用由 Google 管理的安全设置

停用代管式 SSL 证书

如需停用代管式 SSL 证书,请执行以下操作:

  1. 在 Google Cloud Console 中,转到 App Engine > 设置 > 自定义网域

    转到“自定义网域”页面

  2. 选择相应网域,然后点击停用由 Google 管理的安全设置

使用您自己的 SSL 证书

您可以使用自己的证书,而不使用托管式 SSL 证书。如果您的证书没有透明度证明,则由于证书透明度证明是一项强制要求,您的应用可能会在 Chrome 中显示 SSL 警告。如需详细了解证书透明度证明以及如何遵守相关要求,请参阅强制执行证书透明度

如需使用和管理您自己的 SSL 证书而不是 Google 托管式证书,请执行以下操作:

  1. 确保您已在 App Engine 项目中设置自定义网域

  2. 停用默认的 Google 托管式证书

  3. 从您选择的证书授权机构 (CA) 为您的网域获取证书。具体过程可能会因授权机构而异,但可以参阅获取证书了解典型步骤。

  4. 将您的私钥和 SSL 证书文件转换为 App Engine 支持的格式。在上传文件之前,您必须将私钥转换为 RSA 私钥,并将 SSL 证书合并成单个文件。如需了解详情,请参阅转换私钥与合并 SSL 证书

  5. 确保您在 Cloud Console 中拥有适当的权限,并且已验证所有相关网域或其父网域的所有权(第 3 步)。例如:

    • 如果证书适用于 www.example.com,您可以验证 www.example.comexample.com 的所有权。
    • 如果证书适用于 www.example.comsub.example.com,您可以验证 www.example.comsub.example.comexample.com 的所有权。
    • 如果证书适用于 *.example.com,您必须验证 example.com 的所有权。
  6. 上传您的私钥和 SSL 证书,然后将您的网域映射到应用:

    1. 在 Google Cloud Console 中,转到 App Engine > 设置 > SSL 证书

      转到“SSL 证书”页面

    2. 点击上传新证书

    3. PEM encoded X.509 public key certificate 下上传合并后的 SSL 证书(例如 concat.crt),然后在未加密的 PEM 编码的 RSA 私钥下上传 RSA 私钥(例如 myserver.key.pem)。
    4. 点击上传。您上传的每个 SSL 证书均对您的所有其他 Cloud 项目可见并可用,因此无需重复上传同一证书。
    5. 选择要分配给网域的证书,然后点击保存以针对该网域使用 SSL。

  7. 在浏览器中使用 https(例如 https://www.example.com)访问您的网域,以测试更改。

将映射从正在提供服务的证书转移到新证书

当证书快要过期时,您将需要上传新证书并将旧证书的现有映射转移到新证书。以下步骤假定现有证书尚未过期,并且当前正在为您的自定义网域提供服务。

如需从目前正在提供服务的证书转移映射,请执行以下操作:

  1. 从您选择的证书授权机构 (CA) 为您的网域获取一个新证书。请参阅获取证书了解典型步骤。

  2. 将您的私钥和 SSL 证书文件转换为 App Engine 支持的格式。如需了解详情,请参阅转换私钥与合并 SSL 证书

  3. 上传您的 RSA 私钥以及合并后的 SSL 证书:

    1. 在“SSL 证书”页面上传 SSL 证书。

      转到“SSL 证书”页面
      1. 点击上传新证书

      2. PEM 编码的 X.509 公钥证书下方上传合并后的 SSL 证书(例如 concat.crt),然后在未加密的 PEM 编码的 RSA 私钥下方上传 RSA 私钥(例如 myserver.key.pem)。
      3. 点击上传
    2. 从证书列表中选择刚添加的新证书,然后选择正在使用旧证书的网域。
    3. 点击保存,将映射从旧证书转移到新证书。

获取证书

获取 SSL 证书的过程因您使用的证书授权机构而异。这里提供的说明可能需要稍微调整一下。通常,每个证书授权机构都会提供说明来帮助您完成整个过程。

如需为 App Engine 应用获取证书,请执行以下操作:

  1. 使用 openssl 工具生成您的私钥和证书签名请求 (CSR):

    1. 从要在其中创建 server.csr 文件的目录运行以下命令:

      openssl req -nodes -newkey rsa:2048 -keyout [MY_PRIVATE_KEY].key -out [MY_CSR].csr
      

      其中:

      • [MY_PRIVATE_KEY].key 是为存储私钥而生成文件。示例:myserver.key
      • [MY_CSR].csr 是为证书签名请求而生成的文件。示例:server.csr
    2. 看到提示时,请输入以下信息:

      • 您的 2 位数国家/地区代码,例如 US 表示美国。
      • 您的城市名称。
      • 您的公司名称。如果您没有公司,则可以使用自己的姓名。
      • 您的单位部门;或者 NA(如果您没有单位部门)。
      • 代表您网域的通用名称,例如:www.example.com
      • 您的电子邮件地址。

      您不需要提供其他任何值,它们都是可选的。

  2. 确定哪个证书授权机构适合您,然后购买证书。例如,您可以使用 SSLMateThawteComodo 或其他任何证书授权机构。

    如需详细了解受支持的证书类型,请参阅 App Engine 对 SSL 证书的支持

  3. 当您的证书授权机构要求提供 CSR 文件的内容时,请按照其说明从您之前生成的 .csr 文件(例如 server.csr)中复制并粘贴内容。

  4. 当您的证书授权机构请求网域所有者批准时,请按提示操作。

    提示:使用电子邮件批准可能是最简单的方法。您需要在自己的网域帐号中配置电子邮件地址(例如 admin@example.com),以便接收并响应证书授权机构的批准请求。

  5. 在您提供网域所有者的批准后,证书授权机构通常会以 .zip 文件格式将证书发送给您。请将该文件解压缩到工作目录,以便合并这些证书以上传到 App Engine。

转换私钥以及合并 SSL 证书

在向 App Engine 上传私钥和 SSL 证书之前,您必须将私钥转换为 RSA 私钥,然后合并所有 SSL 证书。

  1. 将您之前生成的私钥文件转换为未加密的 RSA 私钥。例如,您可以运行以下 openssl rsa 命令:

    openssl rsa -in [MY_PRIVATE_KEY].key -out [MY_RSA_KEY].key.pem
    

    其中:

    • [MY_PRIVATE_KEY].key 是包含存储的私钥的生成文件。示例:myserver.key
    • [MY_RSA_KEY].key 是包含未加密 RSA 私钥的生成文件。示例:myserver.key.pem

      示例:

      openssl rsa -in myserver.key -out myserver.key.pem
      
  2. 使用以下命令将证书授权机构中的所有 .crt 文件合并成一个文件:

    cat [MY_DOMAIN_CERT].crt [MY_SecureServerCA].crt [MY_TrustCA].crt [MY_TrustExternalCARoot].crt > [MY_CONCAT_CERT].crt
    

    其中

    • [MY_DOMAIN_CERT].crt 是您网域的证书。示例:www_example_com.crt
    • [MY_SecureServerCA].crt[MY_TrustCA].crt[MY_TrustExternalCARoot].crt 是证书授权机构提供的其他证书文件。
    • [MY_CONCAT_CERT].crt 是合并后的文件,其中包含证书授权机构提供的所有 .crt 证书文件。示例:concat.crt

      示例:

      cat www_example_com.crt AddTrustExternalCARoot.crt RSADomainValidationSecureServerCA.crt RSAAddTrustCA.crt > concat.crt
      
  3. 验证您的 SSL 证书和私钥:

    1. 如需验证私钥和证书是否匹配,您可以使用 openssl x509openssl rsa 命令。示例:

      openssl x509 -noout -modulus -in concat.crt | openssl md5
      openssl rsa -noout -modulus -in myserver.key.pem | openssl md5
      

      openssl x509openssl rsa 命令应返回相同的输出。

    2. 如需验证证书及其证书授权机构链均有效,您可以使用 openssl verify 命令。例如:

      openssl verify -verbose -CAfile concat.crt concat.crt
      
  4. 准备就绪后,您可以将 RSA 私钥以及合并后的证书上传到 App Engine

App Engine 对 SSL 证书的支持

App Engine 支持以下证书类型:

  • 单网域/主机名
  • 自签名
  • 通配符
  • 主题备用名称 (SAN)/多网域

您的证书和密钥需满足以下要求:

  • 私钥和证书应该以 PEM 格式上传。
  • 私钥不得加密。
  • 一个证书文件最多可以包含五个证书;此数目包括链式证书和中间证书。
  • 主机证书上的所有主题名称应该匹配用户的已验证网域或者是其子网域。
  • 私钥必须使用 RSA 加密。
  • 允许的密钥模数上限:2048 位

如果主机证书需要中间证书或链式证书(正如许多证书授权机构 (CA) 所颁发),那么您需要将中间证书或链式证书附加到公共证书文件的末尾。

某些 App Engine 功能会使用特殊子网域。例如,应用可能会使用子网域来处理应用服务,或者处理应用的不同版本。如需将子网域与 SSL 一起使用,设置 SAN 或通配符证书是合适的选择。通配符证书仅支持一级子网域。

移除自定义 SSL 证书

如需停止使用自定义 SSL 证书,请执行以下步骤:

  1. 在 Cloud Console 中,转到 App Engine SSL 证书设置页面。

    转到 SSL 证书设置

  2. 点击您要从网域中移除的证书。

  3. 取消选中您不想再使用 SSL 证书的域名,然后点击保存

使用 Strict-Transport-Security 标头

出于安全原因,所有应用都应建议客户端使用 https 连接。如需指示浏览器优先选择 https 而不是 http,请使用 Strict-Transport-Security 标头

查看启用的 TLS 版本和加密方式

  1. 在计算机上安装 nmap Network Mapper(如果尚未安装)。如需了解安装说明,请参阅 https://nmap.org/

  2. 如需查看为您的应用启用了哪些 TLS 版本和加密方式,请输入以下命令:

    nmap -sV --script ssl-enum-ciphers -p 443 hostname

    hostname 替换为您的应用的主机名。您可以使用自定义网域或 App Engine 为您的应用创建的 appspot.com 主机名。例如:

    nmap -sV --script ssl-enum-ciphers -p 443 example.uc.r.appspot.com

停用 TLS 版本和加密方式

如果您使用 Cloud Load Balancing 和无服务器 NEG 将流量路由到 App Engine 应用,则可以通过定义 SSL 安全政策来指定哪些 TLS 版本和加密方式可用于 HTTPS 或 SSL 连接以停用 TLS 版本或加密。