# 谷歌云负载均衡配置 SSL：Google 托管证书与 HTTP 跳转

> 为 Google Cloud 外部应用负载均衡器配置 HTTPS：创建 Google 托管证书或用 Certificate Manager 签通配符，设置 HTTP 跳转、查看签发状态，附国内用户注意事项。

Source: https://ssl.sh/zh/guides/google-cloud-load-balancer-ssl/
Last updated: 2026-11-10

Google Cloud 全球外部应用负载均衡器用免费的 Google 托管证书提供 HTTPS：创建证书并挂到 HTTPS 代理上，把 `example.com` 和 `www.example.com` 解析到负载均衡器的 IP，Google 就会签发并自动续期。HTTP 跳转用同一个 IP 上的 80 端口规则完成。

以截至 2026 年 11 月的 Google Cloud 为准，命令用 gcloud CLI。

## 国内用户先看：没有中国大陆区域

Google Cloud 没有中国大陆境内的区域，用它做负载均衡没有问题，但它不能替代在大陆境内托管、需要 ICP 备案的方案。

在 Google Cloud 官方的区域和负载均衡位置列表里，亚太地区有东京、大阪、首尔、新加坡、孟买、雅加达、悉尼等，离中国大陆最近的是香港（`asia-east2`）和台湾彰化县（`asia-east1`），列表中没有中国大陆城市。这意味着：

- 这里的配置本身不涉及国内环境，证书签发、续期都在 Google 那边完成，国内的 DNS 服务商（阿里云云解析、DNSPod 等）可以正常配合使用。
- 网站必须在中国大陆境内托管的情况，比如要使用国内 CDN 的大陆节点、做需要备案域名的业务，要改用国内云厂商并完成 ICP 备案，HTTPS 配置可以参考 [阿里云 CDN 配置 HTTPS](https://ssl.sh/zh/guides/aliyun-cdn-https/) 和 [腾讯云 CDN 配置 HTTPS](https://ssl.sh/zh/guides/tencent-cloud-cdn-https/)。
- 有 CAA 记录的域名要同时允许 `pki.goog` 和 `letsencrypt.org`。如果 CAA 只写了原来在国内云厂商买证书时用的 CA，切到 Google 托管证书时就会在这里卡住。

## 经典托管证书还是 Certificate Manager

只有几个固定域名、能先把 DNS 切到负载均衡器的，用经典的 Google 托管证书最简单；要通配符、要在切换流量前备好证书，或者证书数量多的，用 Certificate Manager。

两者签出来的都是 DV 证书，都由 Google 自动续期，区别在于怎么证明域名归你：

- **经典 Google 托管证书**（`gcloud compute ssl-certificates`）用负载均衡器授权，Google 要看到域名已经解析到负载均衡器的 IP 才开始签发。好处是一条命令就能建好，缺点是迁移期间会有一段时间证书还没签出来，而且不支持通配符。
- **Certificate Manager** 可以用 DNS 授权：你在 DNS 里加一条 Google 给的 CNAME，Google 据此判断域名归你，不需要流量先切过来，也能签 `*.example.com`。证书放在证书映射里，再把映射挂到 HTTPS 代理上，适合域名多、经常增减的场景。

从别的云或国内机房迁到 Google Cloud 时，推荐先用 Certificate Manager 的 DNS 授权把证书签好，确认 `ACTIVE` 之后再改 A 记录，这样切换过程中访客不会看到证书错误。

## 前提条件

开始前要有一套能正常工作的 HTTP 负载均衡配置。

- 已登录项目的 gcloud CLI，有 Compute Engine 负载均衡权限（签通配符还要 Certificate Manager 权限）。
- 应用的后端服务和网址映射（命令里叫 `web-map`），以及一个预留的全球静态 IP（命令里叫 `web-ip`），例如 `203.0.113.10`。
- 能修改 `example.com` 的 DNS。
- 如果有 CAA 记录，允许 `pki.goog` 和 `letsencrypt.org`。

## 第一步：创建 Google 托管证书

经典的 Google 托管证书用一条 gcloud 命令创建，域名写在 `--domains` 里：

```bash
gcloud compute ssl-certificates create web-cert \
  --domains=example.com,www.example.com --global
```

一张证书可以写多个域名，但每个域名都要解析到这个负载均衡器，任何一个不通都会拖住整张证书。

## 第二步：创建 HTTPS 代理和转发规则

HTTPS 代理引用证书和网址映射，转发规则把 `web-ip` 的 443 端口指向这个代理：

```bash
gcloud compute target-https-proxies create web-https-proxy \
  --url-map=web-map --ssl-certificates=web-cert --global
gcloud compute forwarding-rules create web-https-rule \
  --load-balancing-scheme=EXTERNAL_MANAGED --global \
  --address=web-ip --target-https-proxy=web-https-proxy --ports=443
```

可以再挂一个要求 TLS 1.2 及以上的 SSL 政策：

```bash
gcloud compute ssl-policies create modern-tls --profile=MODERN --min-tls-version=1.2 --global
gcloud compute target-https-proxies update web-https-proxy --ssl-policy=modern-tls --global
```

## 第三步：把 DNS 指向负载均衡器

查出 `web-ip` 的地址，为 `example.com` 和 `www.example.com` 添加 `A` 记录：

```bash
gcloud compute addresses describe web-ip --global --format='get(address)'
```

Google 看到两个域名都解析到这个 IP 后才开始签发。

## 第四步：HTTP 跳转 HTTPS

在同一个 IP 上创建只做跳转的网址映射、HTTP 代理和 80 端口转发规则：

```bash
cat > redirect.yaml <<'EOF'
kind: compute#urlMap
name: web-redirect
defaultUrlRedirect:
  redirectResponseCode: MOVED_PERMANENTLY_DEFAULT
  httpsRedirect: true
EOF
gcloud compute url-maps import web-redirect --source=redirect.yaml --global
gcloud compute target-http-proxies create web-http-proxy --url-map=web-redirect --global
gcloud compute forwarding-rules create web-http-rule \
  --load-balancing-scheme=EXTERNAL_MANAGED --global \
  --address=web-ip --target-http-proxy=web-http-proxy --ports=80
```

要签 `*.example.com` 这样的通配符，改用 Certificate Manager：先创建 DNS 授权（`gcloud certificate-manager dns-authorizations create`），按返回结果添加 CNAME，再用 `--dns-authorizations` 创建证书，放进证书映射，最后用 `--certificate-map` 挂到 HTTPS 代理上。DNS 授权不依赖流量是否已经切过来，适合迁移时提前把证书准备好。

## 验证

每个域名的状态都变成 `ACTIVE` 后证书才算签好。先按域名查看签发状态：

```bash
gcloud compute ssl-certificates describe web-cert --global \
  --format='get(managed.status, managed.domainStatus)'
```

状态变成 `ACTIVE` 后，用 [SSL 证书检查](https://ssl.sh/zh/tools/ssl-checker/) 检查，或在终端运行：

```bash
curl ssl.sh/example.com
curl -sI http://example.com | grep -iE '^(HTTP|location)'
```

## 自动续期

Google 托管证书在到期前自动续期，条件是域名一直解析到这个负载均衡器（负载均衡器授权），或者 DNS 授权的 CNAME 一直保留（Certificate Manager）。你这边不需要运行任何东西。公网证书有效期 2026 年 3 月 15 日起最长 200 天，2029 年 3 月 15 日起 47 天，只是意味着 Google 续得更勤。把 DNS 迁走、删掉授权 CNAME，或新加了排除 Google 所用 CA 的 CAA 记录，续期就会失败。建议把域名加到 [ssl.sh 监控](https://ssl.sh/zh/monitor/)（开发中） 作为外部检查。

## 常见问题排查

- **FAILED_NOT_VISIBLE**：域名还没解析到负载均衡器的 IP，改好 A 记录后等待；国内 DNS 服务商的记录同步偶尔较慢。
- **FAILED_CAA_CHECKING 或 FAILED_CAA_FORBIDDEN**：CAA 记录排除了 Google 用的 CA，见 [CAA 记录阻止签发](https://ssl.sh/zh/errors/caa-record-prevents-issuance/)。
- **一直停在 PROVISIONING**：某个域名有问题，看按域名的状态找出是哪一个，修好 DNS 或从证书里去掉它。
- **浏览器提示域名不匹配**：证书里没有这个主机名，见 [NET::ERR_CERT_COMMON_NAME_INVALID](https://ssl.sh/zh/errors/net-err-cert-common-name-invalid/)。
- **挂上 MODERN 政策后老客户端连不上**：见 [ERR_SSL_VERSION_OR_CIPHER_MISMATCH](https://ssl.sh/zh/errors/err-ssl-version-or-cipher-mismatch/)。
