跳转至

acme.sh生成免费SSL证书

acme.sh 实现了 acme 协议,可以从 ZeroSSL,Let's Encrypt 等 CA 生成免费的证书

安装

curl https://get.acme.sh | sh -s email=user@abc.com

安装服务器位于中国大陆境内, 访问 github 可能会不成功. 所以安装可能会失败.

推荐从这里下载安装:

https://gitee.com/neilpang/acme.sh

安装步骤:

Bash
1
2
3
git clone https://gitee.com/neilpang/acme.sh.git
cd acme.sh
./acme.sh --install -m user@abc.com

更新版本

acme.sh --upgrade

使用免费平台

我使用的是51SSL: https://www.51ssl.com

其他不演示,登录注册,找到ACME模块,配置域名授权

img

在ACME客户端那里,找到专属地址: https://acme.51ssl.com/v2/DV90/directory/0ehxxxxxxxxxxx5lzuo

申请证书

Bash
1
2
3
4
acme.sh --issue \
-d abc.cn -d *.abc.cn \
--dns dns_dp \
--server https://acme.51ssl.com/v2/DV90/directory/0ehxxxxxxxxxxx5lzuo

部署到nginx

Bash
1
2
3
4
acme.sh --install-cert -d abc.cn -d *.abc.cn \
--key-file       /usr/local/openresty/nginx/ssl/abc.cn.key  \
--fullchain-file /usr/local/openresty/nginx/ssl/abc.cn.pem \
--reloadcmd     "/usr/local/openresty/nginx/sbin/nginx  -s reload"
  • 路径/usr/local/openresty/nginx/ssl/是存放证书的位置,也可以直接安装到nginx目录
  • 如果nginx是集群模式,还需要将/usr/local/openresty/nginx/ssl/目录下证书copy到其他nginx主机

配置定时任务,更新证书

Bash
# crontab  -l
56 * * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

手动更新, --force 可以强制更新

"/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" --force

其他命令

查看所有证书

acme.sh --list

查看证书信息

acme.sh --info -d abc.cn

img

删除证书

acme.sh --remove -d abc.cn

修改reload地址

如果需要修改nginx的重启命令,可以通过修改证书文件的Le_ReloadCmd

修改--reloadcmd的命令,配置文件/root/.acme.sh/abc.cn_ecc/abc.cn.conf

img

Le_ReloadCmd='__ACME_BASE64__START_L3Vzci9sb2NhbC9vcGVucmVzdHkvbmdpbngvc2Jpbi9uZ2lueCAgLXMgcmVsb2Fk__ACME_BASE64__END_'

使用base64编码存储,这里演示一下解码过程, 注意截取的编码从START__之后开始,__之前结束

解码:

Bash
echo 'L3Vzci9sb2NhbC9vcGVucmVzdHkvbmdpbngvc2Jpbi9uZ2lueCAgLXMgcmVsb2Fk' | base64 -d

将新的重载命令进行base64编码

Bash
echo -n "nginx -s reload" | base64

img

修改配置文件

vim /root/.acme.sh/abc.cn_ecc/abc.cn.conf

Le_ReloadCmd='__ACME_BASE64__START_bmdpbnggLXMgcmVsb2Fk__ACME_BASE64__END_'

重新查看证书信息

img

nginx配置SSL

Bash
server {
    listen       443 ssl;
    server_name test.abc.cn;

    ssl_certificate      /usr/local/openresty/nginx/ssl/abc.cn.pem;
    ssl_certificate_key  /usr/local/openresty/nginx/ssl/abc.cn.key;
    ssl_session_timeout 30m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers  on;

    location / {
        proxy_pass http://172.26.32.59:8080;
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        client_max_body_size 50m;
        client_body_buffer_size 128k;
        proxy_connect_timeout 90;
        proxy_send_timeout 90;
        proxy_read_timeout 90;
        proxy_buffer_size 4k;
        proxy_buffers 4 32k;
        proxy_busy_buffers_size 64k;
        proxy_temp_file_write_size 64k;
        fastcgi_param CONTENT_LENGTH  $content_length;
    }
}