目前 HTTP2.0 作为新一代的 WEB 协议已经日渐取代使用明文传输的 HTTP 协议,以保障站点数据安全并提高 WEB 服务体验。浏览器要求必须启用 HTTPS 才可以接入 HTTP2,故而我们想要体验 HTTP2 须要有一张 SSL 证书。以下是我对使用 ACME 脚本申请证书并自动续期详细步骤的记录。
bash
// 安装 ACME 脚本
curl https://get.acme.sh | sh
// 设置acme.sh别名,方便后续使用
alias acme.sh=~/.acme.sh/acme.sh
// 设置 ACME 脚本自动更新
acme.sh --upgrade --auto-upgrade
// 由于 ZeroSSL 作为默认 CA,必须先注册帐户才能颁发新证书,故而更换为 Letsencrypt。
acme.sh --set-default-ca --server letsencrypt
如果有一台有公网 IP 的服务器即可通过下列方式进行验证,下面以 jike.dev 为例进行验证,实际使用中需要把 jike.dev 更换为你的域名和网站服务目录。
bash
// 若已搭建 Nginx 服务,可使用 Nginx 验证
acme.sh --issue -d jike.dev -d www.jike.dev --nginx
// 有的时候找不到 Nginx 的 conf 地址,可自定义地址。
acme.sh --issue -d jike.dev --nginx /etc/nginx/conf.d/jike.dev.conf
// 若已搭建网络服务,可使用 HTTP 验证
acme.sh --issue -d jike.dev -d www.jike.dev --webroot /home/wwwroot/jike.dev/
// 如果 80 端口空闲,ACME 脚本可临时监听在 80 端口完成验证
acme.sh --issue -d jike.dev -d www.jike.dev --standalone
// --issue命令生成证书,-d命令绑定域名,绑定的域名都须有相应的网络服务。
bash
// reloadcmd命令使证书更新后重启网络服务
acme.sh --install-cert -d jike.dev \
--key-file /root/jike.dev.key \
--fullchain-file /root/jike.dev.pem \
--reloadcmd "service nginx force-reload"
目前 ACME 脚本应该会在一个月后自动更新证书,如果未能自动更新,我在这里提供一个排查思路。
运行 acme.sh --renew -d jike.dev --force 强制更新域名证书,如果更新失败并返回 Invalid status, ···/well-known/acme-challenge/··· was rejected. Our fetch received an HTTP status code of 404. 可以检查一下 Nginx 是否将所有 80 端口访问全部重定向至 443。
如果全部重定向至 443,需要保留 /.well-known/acme-challenge/ 这个路径的 80 端口访问。