Nginx结合acme.sh自动申请/续期SSL证书(let’s encrypt)

有台服务器需要 SSL 证书用作 WS 与 TLS 加密,因此装了个 Nginx,结合 acme.sh 实现 SSL 证书自动更新。

准备工作

本文使用的操作系统为 Ubuntu。

1. 安装 acme.sh

首先通过 ssh 连接到服务器,之后通过如下命令安装 acme.sh:

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

完成后,输入acme.sh,如果出现 help 菜单,则安装正常。

如果输入acme.sh后显示该命令不存在,则手动设置别名:

 alias acme.sh=~/.acme.sh/acme.sh

2. 安装 Nginx

之后通过如下命令安装 Nginx:

sudo apt install nginx

使用如下命令停止 Nginx 运行:

sudo service nginx stop

申请证书

acme.sh 申请 let’s encrypt 证书时支持两种验证方式,一种是通过网页文件验证,一种是通过 dns txt 解析验证。

前者比较方便,后者需要提供 dns 平台 api 授权 key,不方便使用。

准备好一个域名,将域名解析指向该服务器即可。

1. 只申请并自动更新证书,不用做 web 服务

如果只是想生成 SSL 证书且不用于 Nginx 等其他软件,直接通过 acme.sh 生成并自动更新即可:

acme.sh  --issue -d azimiao.com   --standalone

该命令将会开启一个临时的 80 端口监听,并放置对应的网页验证文件,申请结束后会自动取消监听。

默认生成的证书存放路径为:

~/.acme.sh/azimiao.com/file

这些路径可能随 acme.sh 版本变动而发生变化。

2. 申请并自动更新 ssl 证书,用作 Nginx 配置

首先开启一个简单的 Nginx 服务器监听:

server {
    listen  80;
    server_name  azimiao.com;
    root   /somedir/somedir2;
    index  index.html index.htm;

    access_log /dev/somdir;
    error_log  /var/log/nginx/somdir  warn;

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
    location ~ /\.ht {
       deny  all;
    }
    location / {
        index index.html;

    }
}

通过 acme.sh 自动读取 nginx 配置并生成证书:

acme.sh --issue  -d azimiao.com  --nginx
# 只读取某一个配置文件:
# acme.sh  --issue  -d example.com  --nginx /etc/nginx/conf.d/example.com.conf

通过如下命令将证书复制到指定文件夹:

acme.sh --install-cert -d azimiao.com \
--key-file       /path/to/keyfile/in/nginx/azimiao.com.key  \
--fullchain-file /path/to/fullchain/nginx/azimiao.com.cert \
--reloadcmd     "service nginx force-reload"

确定 nginx 配置文件中 ssl 证书与密钥路径和上文安装位置相同:

server {
    listen       443 ssl http2;
    server_name  azimiao.com;
    root   /somedir/somedir2;
    index  index.html index.htm;

    access_log /dev/somdir;
    error_log  /var/log/nginx/somdir  warn;

    ssl_certificate  /path/to/fullchain/nginx/azimiao.com.cert;
    ssl_certificate_key  /path/to/keyfile/in/nginx/azimiao.com.key;
    ssl_prefer_server_ciphers on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
    add_header Strict-Transport-Security max-age=31536000;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location / {
        index index.html;
    }
}

重启或重载 Nginx 配置:

# 重启
sudo service nginx restart
# 重载配置
# sudo service nginx force-reload

之后,每当证书过期前,acme.sh 将会自动申请证书并将证书移动到安装时指定的位置。

验证

通过如下命令列出当前用户的所有计划任务:

crontab -l

见到如下输出,则代表 acme.sh 计划任务添加正常:

4 0 * * * "/home/username/.acme.sh"/acme.sh --cron --home "/home/username/.acme.sh" > /dev/null

停止自动续期

如果想停止自动续期某个域名,使用如下命令:

# 列出会自动更新证书的域名:
acme.sh --list
# 移除对应域名:
acme.sh --remove -d azimiao.com

如果想停止 acme.sh 的执行,使用如下命令编辑计划任务:

crontab -e

将 acme.sh 的自动执行删除即可。

梓喵出没博客(azimiao.com)版权所有,转载请注明链接:https://www.azimiao.com/7709.html
欢迎加入梓喵出没博客交流群:313732000

我来吐槽

*

*

0位绅士参与评论

  1. WeiCN03-08 14:55 回复

    学习学习~