简介

Lego 实现 Let‘s Encrypt HTTPS 通配符证书。
Lego官方仓库地址
官方文档地址

下载安装

前往官方仓库Release页面下载,本文以lego v4.8.0版本为例

1
2
3
4
5
cd /usr/local/lego
wget -c https://github.com/go-acme/lego/releases/download/v4.8.0/lego_v4.8.0_linux_amd64.tar.gz
tar -zxvf lego_v4.8.0_linux_amd64.tar.gz
rm lego_v4.8.0_linux_amd64.tar.gz
chmod +x lego

获取证书

获取证书有两种方式,一种HTTP和一种DNS。我更倾向于与DNS,因人而异。

HTTP方式

此方式为在服务器运行一个http服务后完成挑战进行获取证书,需服务器运行lego。

1
2
3
4
# 此命令会占用80端口
lego --email="foo@bar.com" --domains="example.com" --http run
# 如果您的80端口已经占用请此命令
lego --email="foo@bar.com" --domains="example.com" --http --http.port :8080 run

如果80端口被nginx占用了,可以在nginx.conf配置文件中的http块的server块中添加如下配置。

1
2
3
4
location /.well-known/acme-challenge {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}

执行完成后会在目录下生成一个.lego文件夹,证书在其certificates文件夹下,进入此文件夹找到证书example.com.crtexample.com.key后cp或者mv到需要的目录即可。比如/usr/local/nginx/conf/ssl/下。

DNS方式

此方式为使用DNS TXT记录完成挑战获取证书

需要准备对应令牌,这里以腾讯云和Godaddy为例,其他服务商可参考官方文档配置。

1
2
3
4
5
6
# 令牌格式
export DNSPOD_API_KEY=1xxxxx,9xxxxxxxxxxxxxxxxxxxxxxxx
# HTTP超时时间
export DNSPOD_HTTP_TIMEOUT=10000
# DNS设置TXT记录的TTL,建议设置600,太高容易检测不到TXT记录
export DNSPOD_TTL=600
1
2
3
4
5
6
7
8
9
# 令牌KEY
export GODADDY_API_KEY=exxxxxxxxxx_5xxxxxxxxxxxxxxxxxxxx
# 令牌SECRET
export GODADDY_API_SECRET=8xxxxxxxxxxxxxxxxxx
# HTTP超时时间
export GODADDY_HTTP_TIMEOUT=10000
# DNS设置TXT记录的TTL,建议设置600
# Godaddy默认1小时太高容易检测不到TXT记录导致颁发失败
export GODADDY_TTL=600

如果有多个--domains域名会将多个域名签进一个证书文件中。比如--domains="example.com"--domains="*.example.com"获取的证书会是一个example.com.crt证书,这个证书可以绑定其顶级域名和所有二级域名上,都可以用。

腾讯云使用--dns="dnspod",Godaddy使用--dns="godaddy",其他可以参考官方文档。

颁发证书

1
lego --path="/usr/local/lego/.lego" -email="替换自己email地址" --domains="example.com" --domains="*.example.com" --accept-tos --dns="自己的域名服务商名" new

续签证书,就是颁发命令后的new替换为renew

1
lego --path="/usr/local/lego/.lego" -email="替换自己email地址" --domains="example.com" --domains="*.example.com" --accept-tos --dns="自己的域名服务商名" renew --reuse-key

编写脚本并定时检查续签

简单脚本

有时间添加,其实很简单,就是写个续签命令执行以下,然后通过cp命令将/usr/local/lego/.lego/certificates下的证书拷贝至需要证书的目录即可,如nginx的配置目录。

定时

执行crontab -e后再最后一行添加如下脚本。
每天0点自动执行

1
0 0 * * * /usr/local/lego/auto.sh > /usr/local/lego/auto.log 2>&1