acme.sh 申请SSL证书并自动续签

2,717 阅读3分钟

前言

最近在研究关于acme.sh申请免费证书和自动续签,在此记录下遇到的问题,本文主要是使用nginx的方式申请证书

参考的文档

github.com/acmesh-offi…

一、安装acme.sh

### 其中邮箱必须指定
curl https://get.acme.sh | sh -s email=你的邮箱地址

### 安装如果报错curl: (35) Encountered end of file,是因为防火墙没有开启443端口
systemctl status firewalld ## 查看防火墙状态
service firewalld start ## 防火墙关闭的情况下要先启动
firewall-cmd --query-port=443/tcp ## 查询443端口是否开放
firewall-cmd --permanent --add-port=443/tcp ## 开放443端口
firewall-cmd --reload ## 重启防火墙(修改配置后要重启防火墙)

如下图即表示安装成功 image.png

二、设置acme.sh别名,方便后续使用

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

三、生成证书

### 由于本文使用的是nginx方式生成证书,所以生成证书前需要先准备好域名对应的nginx配置文件,再执行以下命令生成证书
acme.sh --issue -d 域名地址 --nginx

四、安装或copy证书到nginx目录

注意:默认生成的证书都放在安装目录下: ~/.acme.sh/,这个目录一般来说不能让nginx或Apache直接使用。所以我们需要将证书放到一个指定的目录,习惯是放在/etc/nginx/ssl/目录下。acme提供了--installcert来安装证书,只需指定目标位置, 然后证书文件会被copy到相应的位置。先确保存在/etc/nginx/ssl/你的域名 目录,其中目录可以随意指定

### 创建ssl目录
mkdir /etc/nginx/ssl/你的域名

### 安装证书到指定目录
acme.sh --install-cert -d 你的域名 \
--key-file /etc/nginx/ssl/你的域名/key.pem \
--fullchain-file /etc/nginx/ssl/你的域名/cert.pem \
--reloadcmd "service nginx force-reload"

五、nginx配置ssl

server {
    listen       80;
    listen  [::]:80;
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name  你的域名;
    if ($ssl_protocol = "") { return 301 https://$host$request_uri; }
    
    ssl_certificate /etc/nginx/ssl/你的域名/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/你的域名/key.pem;
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  10m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD;
    ssl_prefer_server_ciphers on;
    
    location / {
        proxy_pass 换成你的地址;
    }
}

配置好后,重启nginx就生效啦!!!

### 重启nginx
systemctl restart nginx

六、更新acme.sh

目前由于 acme 协议和 letsencrypt CA 都在频繁的更新, 因此 acme.sh 也经常更新以保持同步

### 升级 acme.sh 到最新
acme.sh --upgrade

### 如果你不想手动升级, 可以开启自动升级,之后 acme.sh 就会自动保持更新了
acme.sh  --upgrade  --auto-upgrade

### 关闭自动更新
acme.sh --upgrade  --auto-upgrade  0

七、其他

### 证书默认是90天,如需强制更新证书,则执行以下命令
acme.sh --renew -d 你的域名 --force

### acme.sh会自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书,使用以下命令可查看定时任务
crontab -l

### 出错时,可以添加debug查看详情
acme.sh  --issue  .....  --debug