App Engine 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 签名。
如需验证是否已预配证书,请执行以下操作:
-
在 Google Cloud 控制台中,转到 App Engine > 设置 > 自定义网域:
-
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 证书之前,请注意,代管式证书不支持通配符映射。
如果您使用的是子网域且证书由 Let's Encrypt 颁发,则每个基本网域每周最多可以有 50 个托管式证书。如果您达到了此限制,App Engine 会一直尝试颁发代管式证书,直到满足所有请求为止。
如需从您自己的 SSL 证书切换到 Google 管理的 SSL 证书,或者将代管式 SSL 证书添加到具有自定义网域的现有应用,请更新您的网域映射:
-
在 Google Cloud 控制台中,转到 App Engine > 设置 > 自定义网域:
-
选择您要保护的网域,然后点击启用由 Google 管理的安全设置。
停用代管式 SSL 证书
如需停用托管式 SSL 证书,请执行以下操作:
-
在 Google Cloud 控制台中,转到 App Engine > 设置 > 自定义网域:
-
选择相应网域,然后点击停用由 Google 管理的安全设置。
使用专属 SSL 证书
您可以使用自己的证书,而不使用代管式 SSL 证书。如果您的证书没有透明度证明,则由于证书透明度证明是一项强制要求,您的应用可能会在 Chrome 中显示 SSL 警告。如需详细了解证书透明度证明以及如何遵守相关要求,请参阅强制执行证书透明度。
如需使用和管理您自己的 SSL 证书而不是 Google 代管式证书,请执行以下操作:
确保您已在 App Engine 项目中设置自定义网域。
从您选择的证书授权机构 (CA) 为您的网域获取证书。具体过程可能会因授权机构而异,但可以参阅获取证书了解典型步骤。
将您的私钥和 SSL 证书文件转换为 App Engine 支持的格式。在上传文件之前,您必须将私钥转换为 RSA 私钥,并将 SSL 证书合并成单个文件。如需了解详情,请参阅转换私钥以及合并 SSL 证书。
确保您在 Google Cloud 控制台中拥有适当的权限,并且已验证所有相关网域或其父网域的所有权(第 3 步)。例如:
- 如果证书适用于
www.example.com
,您可以验证www.example.com
或example.com
的所有权。 - 如果证书适用于
www.example.com
和sub.example.com
,您可以验证www.example.com
和sub.example.com
或example.com
的所有权。 - 如果证书适用于
*.example.com
,您必须验证example.com
的所有权。
- 如果证书适用于
上传您的私钥和 SSL 证书,然后将您的网域映射到应用:
-
在 Google Cloud 控制台中,转到 App Engine > 设置 > SSL 证书:
-
点击上传新证书。
- 在
PEM encoded X.509 public key certificate
下上传合并后的 SSL 证书(例如concat.crt
),然后在未加密的 PEM 编码的 RSA 私钥下上传 RSA 私钥(例如myserver.key.pem
)。 - 点击上传。您上传的每个 SSL 证书均对您的所有其他 Google Cloud 项目可见并可用,因此无需重复上传同一证书。
- 选择要分配给网域的证书,然后点击保存以针对该网域使用 SSL。
-
在浏览器中使用
https
(例如https://www.example.com
)访问您的网域,以测试更改。
将映射从正在提供服务的证书转移到新证书
当证书快要过期时,您将需要上传新证书并将旧证书的现有映射转移到新证书。以下步骤假定现有证书尚未过期,并且当前正在为您的自定义网域提供服务。
如需从目前正在提供服务的证书转移映射,请执行以下操作:
从您选择的证书授权机构 (CA) 为您的网域获取一个新证书。请参阅获取证书了解典型步骤。
将您的私钥和 SSL 证书文件转换为 App Engine 支持的格式。如需了解详情,请参阅转换私钥以及合并 SSL 证书。
上传您的 RSA 私钥以及合并后的 SSL 证书:
-
在 SSL 证书页面上传 SSL 证书。
转到“SSL 证书”-
点击上传新证书。
- 在 PEM 编码的 X.509 公钥证书下方上传合并后的 SSL 证书(例如
concat.crt
),然后在未加密的 PEM 编码的 RSA 私钥下方上传 RSA 私钥(例如myserver.key.pem
)。 - 点击上传。
-
- 从证书列表中选择刚添加的新证书,然后选择正在使用旧证书的网域。
- 点击保存,将映射从旧证书转移到新证书。
-
获取证书
获取 SSL 证书的过程因您使用的证书授权机构而异。这里提供的说明可能需要稍微调整一下。通常,每个证书授权机构都会提供说明来帮助您完成整个过程。
如需为 App Engine 应用获取证书,请执行以下操作:
使用 openssl 工具生成您的私钥和证书签名请求 (CSR):
从要在其中创建
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 位数国家/地区代码,例如
US
表示美国。 - 您的城市名称。
- 您的公司名称。如果您没有公司,则可以使用自己的姓名。
- 您的单位部门;或者
NA
(如果您没有单位部门)。 - 代表您网域的通用名称,例如:
www.example.com
- 您的电子邮件地址。
您不需要提供其他任何值,它们都是可选的。
- 您的 2 位数国家/地区代码,例如
确定哪个证书授权机构适合您,然后购买证书。例如,您可以使用 SSLMate、Thawte、Comodo 或其他任何证书授权机构。
如需详细了解受支持的证书类型,请参阅 App Engine 对 SSL 证书的支持。
当您的证书授权机构要求提供 CSR 文件的内容时,请按照其说明从您之前生成的
.csr
文件(例如server.csr
)中复制并粘贴内容。当您的证书授权机构请求网域所有者批准时,请按提示操作。
在您提供网域所有者的批准后,证书授权机构通常会以 zip 文件格式将证书发送给您。请将该文件解压缩到工作目录,以便合并这些证书并将合并后的证书上传到 App Engine。
转换私钥以及合并 SSL 证书 {#convert_private_keys_and_concatenate_ssl_certificates}
在向 App Engine 上传私钥和 SSL 证书之前,您必须将私钥转换为 RSA 私钥,然后合并所有 SSL 证书。
将您之前生成的私钥文件转换为未加密的 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
使用以下命令将证书授权机构中的所有
.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
验证您的 SSL 证书和私钥:
如需验证私钥和证书是否匹配,您可以使用
openssl x509
和openssl rsa
命令。示例:openssl x509 -noout -modulus -in concat.crt | openssl md5 openssl rsa -noout -modulus -in myserver.key.pem | openssl md5
openssl x509 和 openssl rsa 命令应返回相同的输出。
如需验证证书及其 CA 链是否有效,您可以使用 openssl verify 命令。例如:
openssl verify -verbose -CAfile concat.crt concat.crt
准备就绪后,您可以将 RSA 私钥以及合并后的证书上传到 App Engine。
App Engine 对 SSL 证书的支持
App Engine 支持以下证书类型:
- 单网域/主机名
- 自签名
- 通配符
- 主题备用名称 (SAN)/多网域
您的证书和密钥需满足以下要求:
- 私钥和证书应该以 PEM 格式上传。
- 私钥不得加密。
- 一个证书文件最多可以包含五个证书;此数目包括链式证书和中间证书。
- 主机证书上的所有主题名称应该匹配用户的已验证网域或者是其子网域。
- 私钥必须使用 RSA 加密。
- 允许的密钥模数上限:2048 位
如果主机证书需要中间证书或链式证书(正如许多证书授权机构 [CA] 所颁发),那么您必须将中间证书或链式证书附加到公共证书文件的末尾。
某些 App Engine 功能会使用特殊子网域。例如,应用可能会使用子网域来处理应用服务,或者处理应用的不同版本。如需将子网域与 SSL 一起使用,设置 SAN 或通配符证书是合适的选择。通配符证书仅支持一级子网域。
移除自定义 SSL 证书
如需停止使用自定义 SSL 证书,请执行以下步骤:
在 Google Cloud 控制台中,转到 App Engine SSL 证书设置页面。
点击您要从网域中移除的证书。
取消选中您不想再使用 SSL 证书的域名,然后点击保存。
使用 Strict-Transport-Security 标头
出于安全原因,所有应用都应建议客户端使用 https
连接。如需指示浏览器优先选择 https
而不是 http
,请使用 Strict-Transport-Security
标头。
查看启用的 TLS 版本和加密方式
在计算机上安装
nmap
Network Mapper(如果尚未安装)。如需了解安装说明,请参阅 https://nmap.org/。如需查看为您的应用启用了哪些 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 版本或加密。