教程[17] 使用 acme.sh 申请 GCP SSL 证书以及自动更新

开篇废话

前阵子偶然刷到了帖子,介绍 GCP 证书颁发,于是我也水了一篇。

另外折腾了下证书自动下发到其它机器,虽然方案有点 dirty ,不过它工作!

正文

(前半部分都和上面提到的帖子一样,建议参考原帖)

申请内测权限

目前还是公测状态,所以我们要填表格内测,链接如下:
https://docs.google.com/forms/d/1Euhflb5CXpuLik8czElhyAloTZJZobar4086dmlPqXA

其中 Google Cloud Project ID 为 cloud.google.com 里面的,如图所示:
gcp project id

没有的话自己去新建个项目

然后等邮件,通过了就 ok ,应该工作日内一天就可以了。

获取凭证

enable manage

进入 https://console.cloud.google.com/apis/library/publicca.googleapis.com
选择 ENABLE 然后等开通完成后点击 MANAGE
点击左上角的 shell 图标,打开 Google Cloud Shell,输入以下命令获得凭证:

gcloud beta publicca external-account-keys create

[b64MacKey: LYRZMGNS4-6YLKrodWDA7fGG-umzKZntgSsu4e5FdPNIWy5D7KD20U0GfFKe6PKau0kimy_edOlP9H_twG1ftA keyId: ca111012ea928ffa14e54198f4f3b49d]

get external keys

这里的 b64MacKey 以及 keyId 下文会用到

根据峰峰反馈 ,key 只能一台机器内使用,如果有多台机器需要生成多个 key

根据原帖楼主反馈,key 在 7 天内没使用(acme.sh –register-account)会自动过期,需要重新申请。

安装 acme.sh

本地注册账号 & 颁发证书

这里和其它家的差不多,我使用了 dns_cf 模式

关于 dns_cf 模式请参照 官方wiki ,这里不再介绍。

注意,默认启用了 ecc 证书,如果不需要请把参数 --ecc --keylength ec-256 去掉

也就 Windows XP 不支持 ECC 了,所以我觉得没有必要生成两份证书来保持对这老爷系统的兼容。
也就是说,为了保持兼容,我们需要生成两份证书,一份是 RSA 然后是 ECC,然后再配置 Nginx 比较麻烦点,并且我个人没有这个兼容的需求,就不再贴相关命令以及配置了。



输出
(不会有任何数据传到我服务器,可以 F12 自行验证)

大概就是需要先在本地注册账户(类似 ZeroSSL CA),其它操作方式都是一样的。
(命令可在原帖里面找到,这里写了生成器就不再提供)

cron

这里我使用了 systemd 来每日执行,参考官方 wiki:
https://github.com/acmesh-official/acme.sh/wiki/Using-systemd-units-instead-of-cron

下发到其它机器

此部分应人而异,可以自己想想自己设计一个最适合自己的方案。

鉴于这篇文章太水了,所以再介绍一下我是怎么让其它机器同步更新的

这里我使用了 ZeroTier 作为大内网方案,所有机器都在一个局域网内,所以下载证书就走 http + 内网了,公网也没什么,就是懒了((

大概思路是,内网 Nginx 开 autoindex on;
然后其它机器定时 wget 里面的证书到 /etc/nginx/ssl 并且让 Nginx 重新载入,

Nginx:

server {
  listen 192.168.222.11:80;
  root /data/www/dotfiles;
  autoindex on;
}

添加一个服务(这里可以用 crontab 代替,不提供教程):

# systemctl edit h-daily --full --force

[Unit]
Description=huggy's daily task
After=network.target network-online.target nss-lookup.target zerotier-one.service

[Service]
User=root
Type=simple
ExecStart=/bin/daily.sh
WorkingDirectory=/

[Install]
WantedBy=multi-user.target

让服务每天运行一次:

# systemctl edit h-daily.timer --full --force

[Unit]
Description=h-daily's daily task timer

[Timer]
OnCalendar=daily
AccuracySec=1h
Persistent=true
RandomizedDelaySec=1h

[Install]
WantedBy=timers.target

启动定时服务:

# systemctl enable h-daily.timer

查看状态:

# systemctl status h-daily.timer

● h-daily.timer - h-daily's daily timer
     Loaded: loaded (/etc/systemd/system/h-daily.timer; enabled; vendor preset: disabled)
     Active: active (waiting) since Thu 2022-04-14 17:42:10 UTC; 3 days ago
      Until: Thu 2022-04-14 17:42:10 UTC; 3 days ago
    Trigger: Tue 2022-04-19 00:14:12 UTC; 12h left
   Triggers: ● h-daily.service

Apr 14 17:42:10 xxx systemd[1]: Started h-daily's daily timer.

编辑每日运行脚本:

# nano /bin/daily.sh

#!/bin/sh
cd /etc/nginx/ssl
wget -r 192.168.222.11/certs/ -N --no-directories --no-parent
systemctl force-reload nginx

记得给 sh 加权限:

chmod +x /bin/daily.sh

总结

总算看到 Google 也杀入证书行列了,不过我个人认为除了 OCSP(ocsp.pki.goog) 在国内有节点以外并没有比 let’s encrypt 有更好的优势。
ta们相比起来依然是3个月的证书,IP证书也不好下发(需要验证整个段的所有权,对于我们来说约等于不支持)。
并且是和 GCP 绑定的(需要强制登录那样),而 let’s encrypt 甚至不需要邮箱就可以下发证书。

想到在这之前都是用 Cloudflare 提供的免费证书 + 15年的自签来完成这些,很少机会把 vps 当成源站来用,有人来发邮件了才知道证书过期了。

然后基于 systemd 弄了简单的每日更新服务,也算是有点收获?
底裤的大胜利!

huggy.moe ssl