acme.sh 实现了acme协议,可以从ZeroSSL、Let's Encrypt 免费生成ssl证书。本文采用Let's Encrypt生成证书。
acme.sh: https://github.com/acmesh-official/acme.sh
ZeroSSL: https://zerossl.com/
Let's Encrypt: https://github.com/acmesh-official/acme.sh.git
Let's Encrypt和ZeroSSL是证书颁发机构,为HTTPS连接提供完全免费的SSL/TLS证书。Let's Encrypt比ZeroSSL更常见,但它的功能有限。ZeroSSL有多个免费/付费版本。两者生成的免费版证书都只有3个月
的有效。
ZeroSSL和Let's Encrypt对比可以查看这篇文章:https://technocript.com/zerossl-vs-lets-encrypt/
acme.sh 安装
curl https://get.acme.sh | sh
alias acme.sh=~/.acme.sh/acme.sh # 创建别名,在其他地方可以直接使用
acme.sh -v # 查看版本
https://github.com/acmesh-official/acme.sh
v3.0.8
acme.sh --help # 查看命令和帮助
acme.sh脚本会安装在主目录 ($HOME): ~/.acme.sh/
所有证书也将放在此文件夹中,2.0
版本前默认采用Let's Encrypt
作为证书服务商,3.0
后默认采用ZeroSSL
。
ssl证书生成
签发 SSL 证书需要证明这个域名是属于你的,即域名所有权
,一般有两种方式验证:http 和 DNS验证。
- http方式:acme.sh 会自动在你的网站根目录下放置一个文件,来验证你的域名所有权,最后会自动删除验证文件。
- DNS方式:会在域名解析上增加一条txt解析,验证域名所有权。
本文采用DNS和DNS API的方式进行。此方式会调用域名服务商(我的是阿里)的API接口,生成时自动增加一条txt解析,生成完后自动删除。
设置API key
获取阿里云app_key 和 app_secret,阿里云key生成文档参考:https://help.aliyun.com/zh/ram/user-guide/ram-user-management
设置的key信息会保存在~/.acme.sh/account.conf
文件中
export Ali_key = "xxxxxxxxx"
export Ali_Secret="xxxxxxx"
生成证书
acme.sh --issue --dns dns_ali -d bbdou.top -d *.bbdou.top --server letsencrypt
- issue: 生成证书
- dns: 指定dns服务商为 阿里云
- d: 指定域名,*.bbdou.top为泛域名
- server: 指定证书生成机构为Let's Encrypt
生成的证书保存在~/.acme.sh/
目录
acme.sh --list # 查看当前证书列表
Main_Domain KeyLength SAN_Domains CA Created Renew
bbdou.top "ec-256" *.bbdou.top LetsEncrypt.org 20XX-XX-XXT01:59:47Z 20XX-XX-21T01:59:47Z
Nginx
生成指定证书生成路径,当证书有续期后自动更新服务。
acme.sh --installcert -d bbdou.top -d *.bbdou.top --server letsencrypt --key-file /data/docker/nginx/ssl/bbdou.top/bbdou.top.key --fullchain-file /data/docker/nginx/ssl/bbdou.top/fullchain.cer --reloadcmd "docker exec nginx nginx -s reload"
crontab -l # 查看系统定时任务,已经能看到acme.sh的定时任务
59 2 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
- installcert: 安装
- key-file: key文件路径
- fullchain-file :fullchain路径
- reloadcmd: 当证书有更新时执行的命令(因为我的服务安装在docker里的)
Nginx配置参考
server {
listen 80;
listen [::]:80;
server_name bbdou.top;
# 禁止通过 IP 直接访问
if ($host ~ ^\d+\.\d+\.\d+\.\d+$) {
return 444;
}
# 重定向到 https
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name bbdou.top;
ssl_certificate "/etc/nginx/ssl/bbdou.top/fullchain.cer";
ssl_certificate_key "/etc/nginx/ssl/bbdou.top/bbdou.top.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# 禁止通过 IP 直接访问
if ($host ~ ^\d+\.\d+\.\d+\.\d+$) {
return 444;
}
location / {
...访问配置
}
}
评论区