使用 acme.sh 申请 Google 公共证书

适用场景:需要免费 HTTPS 证书且希望由 Google 签发(不依赖 Let’s Encrypt)。本文将带你走完从开通 Google Public CA API、获取 EAB 密钥,到用 acme.sh 签发并安装 RSA/ECC 证书的全部流程。

首发时间:2022-04-19,更新日期:2023-12-16(Google Public CA 已于 2023 年 5 月结束内测)。

证书特点

Google Public CA 支持通过 ACME 协议自动签发证书,主要特点如下:

  • 支持多域名与通配符证书。
  • 支持 ECC 和 RSA 证书。
  • 支持 IP 证书,但需要对应 IP Block 的所有者完成验证。
  • 证书最长有效期为 90 天。
  • 不支持 IDN 域名。

开通 Google Public CA API

首先需要拥有一个 Google Cloud Platform 账号。

申请内测功能

Google Public CA 已于 2023 年 5 月结束内测,普通 GCP 账号即可直接使用 GTS ACME API,这一步现在通常可以跳过。

早期如果未开通,执行相关命令可能会出现如下报错:

(gcloud.alpha.publicca.external-account-keys.create) NOT_FOUND: Method not found.

获取 EAB 密钥 ID 和 HMAC

  1. 启用 Public Certificate Authority API:
gcloud services enable publicca.googleapis.com
  1. 选择当前项目:
gcloud config set project [project ID]
  1. 创建外部账户密钥:
gcloud publicca external-account-keys create

成功后会返回如下格式的信息,后续注册 ACME 账户时会用到:

Created an external account key
[b64MacKey: xxxxxxxxxxxxxxxxxxxxxxx
keyId: xxxxxxxxxxxxxxx]

注意:EAB 密钥通常有有效期,建议申请后尽快使用。

申请证书

默认以 root 用户演示。

安装 acme.sh

curl https://get.acme.sh | sh

如果后续提示 command not found,可以执行:

source ~/.bashrc

配置 Cloudflare API

如果你使用 Cloudflare 做 DNS 验证,可先导出对应环境变量:

export CF_Token="xxxxxxxxxxxxxxxxxxxxxxxx"
export CF_Account_ID="xxxxxxxxxxxxxxxxxxxxxxxx"
export CF_Zone_ID="xxxxxxxxxxxxxxxxxxxxxxxx"

注册 Google ACME 账户

acme.sh --register-account -m [邮箱] --server google \
  --eab-kid [申请到的 keyId] \
  --eab-hmac-key [申请到的 b64MacKey]

如果出现 DNS 或连接错误,可先升级 acme.sh

acme.sh --upgrade

也可以手动指定服务端地址:

acme.sh --register-account -m [邮箱] \
  --server https://dv.acme-v02.api.pki.goog/directory \
  --eab-kid [申请到的 keyId] \
  --eab-hmac-key [申请到的 b64MacKey]

设置默认 CA

acme.sh --set-default-ca --server google

签发证书

签发 RSA 证书:

acme.sh --issue --dns dns_cf -d example.com -d *.example.com --keylength 2048

签发 ECC 证书:

acme.sh --issue --dns dns_cf -d example.com -d *.example.com --keylength ec-256

安装到 Nginx

安装 RSA 证书:

acme.sh --install-cert -d example.com \
  --key-file /path/to/ssl/private.key \
  --fullchain-file /path/to/ssl/fullchain.pem \
  --capath /path/to/ssl/ca.pem \
  --reloadcmd "service nginx reload"

安装 ECC 证书:

acme.sh --install-cert -d example.com --ecc \
  --key-file /path/to/ssl/ecc_private.key \
  --fullchain-file /path/to/ssl/ecc_fullchain.pem \
  --capath /path/to/ssl/ecc_ca.pem \
  --reloadcmd "service nginx reload"

验证与自查

  1. acme.sh --list 能看到已签发的证书记录
  2. openssl x509 -in /path/to/ssl/fullchain.pem -noout -issuer -dates 检查签发者(应为 Google Trust Services)与有效期
  3. curl -I https://example.com 返回 200,浏览器地址栏证书有效

参考