Nginx 配合 acme.sh 申请 ssl 证书并部署和自动续期

1. 说明

acme.sh 可以方便地快速申请免费 SSL 证书,并且定期自动更新。是非常好用的工具。

我曾经是使用阿里云的免费证书,当时期限是1年,每次手动申请、下载证书、scp上传服务器、重启服务器nginx,非常麻烦。

再加上近期免费证书的期限进一步缩短成了3个月,使这个麻烦进一步扩大。

研究了一下,发现 acme.sh 实在太方便了

2. 配合 nginx 使用

2.1 安装 acme.sh

配合 nginx 使用

首先需要安装 acme.sh

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

安装完成后,acme.sh 脚本会自动添加到 ~/.acme.sh/ 目录中,并自动配置好环境变量。

可以尝试 acme.sh 运行一下看看是否能成功运行。

2.2 邮箱注册

将下方 youremail@gmail.com 替换为你的邮箱后运行

acme.sh --register-account -m youremail@gmail.com

2.3 配置 Nginx

acme可以用域名验证的方式验证域名所有权。

为此需要简单配置一下 nginx 的配置文件(在 /etc/nginx/sites-enabled/ 下,没有可以 vi 建一个)使能够被 SSL 证书颁发方访问到你的域名下的特定验证用的文件

server {
    listen 80;
    server_name pangruitao.com www.pangruitao.com; # 替换为你的域名

    location /.well-known/acme-challenge/ {
        root /var/www/html; # 这个目录是 acme.sh 验证时使用的目录
        try_files $uri =404;
    }
}

重启 nginx 使配置生效

systemctl restart nginx

2.4 申请证书

将下面域名替换为你的后运行

acme.sh --issue -d pangruitao.com -d www.pangruitao.com --webroot /var/www/html

看到以下内容则代表运行成功

2.5 配置证书至 Nginx

个人习惯使用 key 和 pem 两文件。可以用 acme.sh 导出,只需简单运行即可

将下面域名换成你的

acme.sh --install-cert -d pangruitao.com \
--key-file /root/certs/pangruitao.com/pangruitao.com.key \
--fullchain-file /root/certs/pangruitao.com/pangruitao.com.pem \
--reloadcmd "systemctl reload nginx"

最后修改 nginx 配置,使 nginx 的所有流量使用此证书并且都走 https

server {
    listen 80;
    server_name pangruitao.com www.pangruitao.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name pangruitao.com www.pangruitao.com;

    ssl_certificate /root/certs/pangruitao.com/pangruitao.com.pem;
    ssl_certificate_key /root/certs/pangruitao.com/pangruitao.com.key;

    root /var/www/html;

    location /.well-known/acme-challenge/ {
        root /var/www/html; # 这个目录是 acme.sh 验证时使用的目录
        try_files $uri =404;
    }

    location / {
        try_files $uri $uri/ =404;
    }


}

再最后重启一下 nginx

systemctl reload nginx

没意外的话,则应该已经生效了

2.6 自动续期

acme.sh 默认会自动续期证书,你可以在 /var/spool/cron/crontabs/ 目录下找到 acme.sh 自动添加的 cron 任务

一般而言希望续期后自动重启 nginx,则需要运行一下

acme.sh --install-cert -d pangruitao.com \
--key-file /root/certs/pangruitao.com/pangruitao.com.key \
--fullchain-file /root/certs/pangruitao.com/pangruitao.com.pem \
--reloadcmd "systemctl reload nginx"

这个安装命令不仅仅会生成证书文件和重启nginx,还会把这些操作自动加到续期任务中

发表评论