acme.sh自动化配置证书,永久免费SSL

acme.sh是一个开源的项目,实现了ACME协议, 可以从let’s encrypt生成免费的证书,配合一些cronjob可以实现自动化的部署证书。
现在的免费证书,需要3个月一刷新,即使是买的证书,一次性买多年,也要一年一更换,acme.sh很好的解决了这个问题。
尝试了一下,把博客移动到了阿里云的ECS里,这里有一个阿里云的云小站 , 99可以搞一个2C2G/40GSSD/3M带宽的ECS还是非常合适的。

安装 acme.sh

以下都以当前域名 tiaobug.com 和 www.tiaobug.com 为例。安装使用root或non-root用户都可以。

1
curl https://get.acme.sh | sh -s email=i@tiaobug.com # 改成自己的邮箱

脚本中间会访问github,如果访问有困难,可以参考用gitee的镜像。

1
2
3
git clone https://gitee.com/neilpang/acme.sh.git
cd acme.sh
./acme.sh --install -m i@tiaobug.com

安装后,会自动增加一个定时任务用于刷新证书。

1
2
# crontab -l
24 21 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

同时,安装过程不会新增和修改任何的系统功能和文件, 所有的修改都在安装目录 ~/.acme.sh/ 中,所以删除的时候也就很容易。

验证域名

acme.sh生成证书前,需要验证域名的所有权和服务的可用,它实现了acme协议支持的所有验证协议,支持http文件访问和dns text文本解析验证.

http文件访问验证

这里推荐http文件解析认证,预先nginx里配置一个80服务,让域名可以访问。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# vi /etc/nginx/sites-available/default

server {
listen 80;
listen [::]:80;

server_name tiaobug.com www.tiaobug.com ;

root /home/tiaobug/web-sites/tiaobug.com/;
index index.html;

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

执行验证:

1
acme.sh --issue -d tiaobug.com -d www.tiaobug.com --webroot /home/tiaobug/web-sites/tiaobug.com/

执行完成后,会在webroot目录下生成多个文件

1
2
3
4
[Thu Oct 17 09:30:36 AM CST 2024] Your cert is in: /root/.acme.sh/tiaobug.com_ecc/tiaobug.com.cer
[Thu Oct 17 09:30:36 AM CST 2024] Your cert key is in: /root/.acme.sh/tiaobug.com_ecc/tiaobug.com.key
[Thu Oct 17 09:30:36 AM CST 2024] The intermediate CA cert is in: /root/.acme.sh/tiaobug.com_ecc/ca.cer
[Thu Oct 17 09:30:36 AM CST 2024] And the full-chain cert is in: /root/.acme.sh/tiaobug.com_ecc/fullchain.cer

acme.sh会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证,完成验证后会删除验证文件,不用担心文件会泄露。

参照文件,acme.sh还提供其他的几个封装好的测试工具,在nginx或apache有直接的验证工作,不过我没有测试过。

1
2
acme.sh --issue -d tiaobug.com -d www.tiaobug.com --apache
acme.sh --issue -d tiaobug.com -d www.tiaobug.com --nginx

如果你还没有运行任何web服务, 80端口是空闲的, 那么acme.sh还能假装自己是一个webserver, 临时侦听80端口, 完成验证。

1
acme.sh --issue  -d tiaobug.com -d www.tiaobug.com --standalone

DNS text解析验证

如果做完了上面的一步,这一步不需要,两种验证方式选一种就可以了,在aliyun ECS的条件下相对来说http验证更加简单一些。
DNS text解析验证的好处是, 你不需要任何服务器, 不需要任何公网IP, 只需要DNS的解析记录即可完成验证. 坏处是,如果不同时配置 Automatic DNS API,使用这种方式 acme.sh 将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。

1
acme.sh --issue --dns -d tiaobug.com -d www.tiaobug.com --yes-I-know-dns-manual-mode-enough-go-ahead-please

然后, acme.sh 会生成相应的解析记录显示出来, 你只需要在你的域名管理面板中添加这条 txt 记录即可.

等待解析完成之后, 重新生成证书:

1
acme.sh --renew -d tiaobug.com -d www.tiaobug.com --yes-I-know-dns-manual-mode-enough-go-ahead-please

注意第二次这里用的是 –renew

dns方式的真正强大之处在于可以使用域名解析商提供的api自动添加txt记录完成验证.

acme.sh目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等数十种解析商的自动集成.

以dnspod为例, 你需要先登录到dnspod账号, 生成你的api id和api key, 都是免费的. 然后:

1
2
3
export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"
acme.sh --issue --dns dns_dp -d tiaobug.com -d www.tiaobug.com

证书就会自动生成了. 这里给出的api id和api key会被自动记录下来, 将来你在使用dnspod api的时候, 就不需要再次指定了, 直接生成就好了:

1
acme.sh --issue -d mydomain2.com --dns  dns_dp

更详细的 api 用法: https://github.com/Neilpang/acme.sh/blob/master/dnsapi/README.md

生成并安装证书

验证成功以后,我们就可以生成证书了:

1
2
3
4
5
# mkdir -p /home/tiaobug/ssl/tiaobug.com/
# acme.sh --install-cert -d tiaobug.com -d www.tiaobug.com \
--key-file /home/tiaobug/ssl/tiaobug.com/key.pem \
--fullchain-file /home/tiaobug/ssl/tiaobug.com/cert.pem \
--reloadcmd "service nginx force-reload"

这里用的是service nginx force-reload, 不是service nginx reload, reload并不会重新加载证书, 所以用的force-reload。
如果不指定路径–key-file和–fullchain-file,默认生成的证书都放在安装目录下: ~/.acme.sh/, 尽量不要直接使用此目录下的文件。

–install-cert命令可以携带很多参数, 来指定目标文件. 并且可以指定 reloadcmd, 当证书更新以后, reloadcmd会被自动调用,让服务器生效.
详细参数请参考: https://github.com/Neilpang/acme.sh#3-install-the-issued-cert-to-apachenginx-etc

查看已安装证书信息

1
acme.sh --info -d www.tiaobug.com

配置nginx,安装证书

在nginx的配置文件增加下面的一段,配置完成, 执行命令nginx -s reload重启nginx即可.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
listen 443 ssl;
listen [::]:443 ssl;

server_name tiaobug.com www.tiaobug.com;

root /home/tiaobug/web-sites/tiaobug.com/;
index index.html;
ssl_certificate "/home/tiaobug/ssl/tiaobug.com/cert.pem";
ssl_certificate_key "/home/tiaobug/ssl/tiaobug.com/key.pem";

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;

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

ssl_certificate和ssl_certificate_key一定要指向正确的证书文件,cert和key文件不要搞反了。

证书自动更新

目前证书在60天以后会自动更新,无需任何操作,cronjob会代劳,不过按照ACME的尿性,以后肯定还会再次改短,可能会缩短这个自动更新时间, 不过都是自动的, 不用关心.

acme.sh的本身的更新

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

升级 acme.sh 到最新版:

1
acme.sh --upgrade

如果你不想手动升级, 可以开启自动升级:

1
acme.sh --upgrade --auto-upgrade

之后, acme.sh 就会自动保持更新了.

也可以随时关闭自动更新:

1
acme.sh --upgrade --auto-upgrade  0
Notice: 正常情况下,这里会有一个基于utteranc.es的留言系统,如果看不到,可能要想想办法才能看到。

Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2024 Tiaobug All Rights Reserved.

本站总访问量    次