使用 acme.sh 签发和自动续期 ssl https 证书

acme.sh 是一个热度非常高的签发和自动续期 https 证书的工具,虽然官网上提供了充分的操作说明,但是不够简洁,本文以在 nginx 中签发和配置http 为例,列出必要的几个简单步骤。

安装

因为网络原因,github 大部分人是不能直接访问的,所以官网的一键安装脚本可能并不好用。推荐自己手工将代码下载下来操作。

1、下载 git 代码

https://github.com/acmesh-official/acme.sh

下载代码》解压缩,文件清单如下:

bash 复制代码
[root@test acme.sh-master]# ll
total 308
-rwxrwxrwx 1 root root 226257 Dec 11 04:00 acme.sh
drwxrwxrwx 2 root root   4096 Dec 11 04:00 deploy
drwxrwxrwx 2 root root   8192 Dec 11 04:00 dnsapi
-rw-rw-rw- 1 root root   1528 Dec 11 04:00 Dockerfile
-rw-rw-rw- 1 root root  35149 Dec 11 04:00 LICENSE.md
drwxrwxrwx 2 root root   4096 Dec 11 04:00 notify
-rw-rw-rw- 1 root root  22455 Dec 11 04:00 README.md

2、安装acme.sh

指定自己的 Email,安装命令如下:

java 复制代码
chmod +x acme.sh
./acme.sh --install -m 365384722@qq.com

按官方说明,安装命令实际上执行了如下3步操作:

  • 创建 acme.sh 并将其复制到当前用户主目录($HOME):~/.acme.sh/ 中,以后签发的所有证书和配置也将放置在此文件夹中。
  • 创建命令别名:acme.sh=~/.acme.sh/acme.sh,此后在任何位置都可以直接使用 acme.sh 命令。
  • 创建每日cron作业,以便在需要时检查和续订证书,可以使用 crontab -l 查看自动配置的作业内容,你也可以使用 crontab -e 自定义时间。

cron 内容如下所示:

bash 复制代码
24 5 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

安装后,如果想让 acme.sh 别名生效,你可能需要关闭当前ssh会话并重新打开它。

3、启用acme的自动升级

bash 复制代码
acme.sh --upgrade --auto-upgrade

配置自动升级后,查看 ~/.acme.sh/account.conf 可以看到 AUTO_UPGRADE='1'

签发证书

官网签发证书的方式主要分为3种:

  • 基于 webroot 的方式
  • 手工 TXT 域名解析的方式
  • 自动 API 的方式

如果你希望以后都能自动续期而不需要人工介入,那么你必须选择基于 API 的方式,前两者本文不赘述,详见官网说明。

acme 支持了很多域名服务商,使用参数 --dns 指定,如下基于阿里云自动的方式进行示例:

1、登录阿里云控制台,记录下 AKIDAKSCT

2、执行两条 export 命令设置临时变量

bash 复制代码
export Ali_Key="<AKID>"
export Ali_Secret="<AKSCT>"

3、执行签发命令,使用 --dns dns_ali 明确阿里云API通道

bash 复制代码
./acme.sh --issue --dns dns_ali -d *.demo.com -d demo.com

签发成功后,你可以查看配置文件 ~/.acme.sh/account.conf,会发现该配置文件记录了我们 export 的两个值,之所以记录下来是为了后续自动续签使用。

安装证书到Nginx

如下脚本以 nginx 为例,脚本中设置证书的目标位置、证书更新后需要执行什么命令来刷新 nginx 服务使之生效。

bash 复制代码
acme.sh --install-cert -d goodcol.com \
--key-file       /opt/soft/nginx/ssl/goodcol.com/key.pem  \
--fullchain-file /opt/soft/nginx/ssl/goodcol.com/cert.pem \
--reloadcmd     "docker exec -it nginx-forward nginx -s reload"

因为我的 nginx 是基于docker 的,所有我的 reloadCmd 是对docker 里面的 nginx 进行 reload,其中证书文件是我 nginx 容器挂在宿主机文件的位置。

其他更多内容,详见官方文档


(END)

相关推荐
YannSea6 小时前
快速签发SSL证书:acme.sh全指南
网络·网络协议·ssl
一位搞嵌入式的 genius6 小时前
HTTP与HTTPS深度解析:从明文传输到安全通信
计算机网络·安全·http·https·网络通信
Hello,C++!7 小时前
linux下libcurl的https简单例子
linux·数据库·https
Aric_Jones1 天前
HTTP和HTTPS的区别
网络协议·http·https
2501_915918411 天前
移动端 HTTPS 抓包实战,多工具组合分析与高效排查指南
数据库·网络协议·ios·小程序·https·uni-app·iphone
kyle~1 天前
计算机网络---传输层安全 SSL与TLS
计算机网络·安全·ssl
赖small强2 天前
【ZeroRange WebRTC】KVS WebRTC 示例中的 HTTP 通信安全说明
https·webrtc·tls·aws sigv4·信道安全·时间与重放控制
赖small强2 天前
【ZeroRange WebRTC】Amazon Kinesis Video Streams WebRTC Data Plane REST API 深度解析
https·webrtc·data plane rest·sigv4 签名
果壳~2 天前
【Java】使用国密2,3,4.仿照https 统一请求响应加解密
java·https
赖small强3 天前
【ZeroRange WebRTC】Amazon Kinesis Video Streams WebRTC Control Plane API 深度解析
https·webrtc·control plane