目前 HTTP2.0 作为新一代的 WEB 协议已经日渐取代使用明文传输的 HTTP 协议,以保障站点数据安全并提高 WEB 服务体验。浏览器要求必须启用 HTTPS 才可以接入 HTTP2,故而我们想要体验 HTTP2 须要有一张 SSL 证书。以下是我对使用 ACME 脚本申请证书并自动续期详细步骤的记录。
1.安装 ACME 脚本,并更换默认证书。
// 安装 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
2.域名验证 如果没有公网 IP,可使用 DNS 验证,具体步骤遵循各域名服务商指导。该方式可以申请多域名、泛域名证书,达到很多域名可以共用一张证书的目的,但无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。
如果有一台有公网 IP 的服务器即可通过下列方式进行验证,下面以 jike.dev 为例进行验证,实际使用中需要把 jike.dev 更换为你的域名和网站服务目录。
// 若已搭建 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
3.安装证书到指定文件夹 为了保证证书后期的自动更新,不要直接使用或拷贝默认生成的证书,而要使用 acme.sh --install-cert
命令指定目标位置。下面以 jike.dev 为例进行安装,实际使用中需要把 jike.dev 更换为你的域名和网站服务目录。
// 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"
4.更新证书 目前证书无需任何操作会在 60 天以后自动更新,若想要停止某域名证书的自动更新使用 acme.sh --remove -d jike.dev
命令,或者在安装目录中删除对应域名目录即可。
目前 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 端口访问。