2020-04-12更新:2018 年 3 月 13 日起Let’s Encrypt支持通配符证书
为什么
- Let’s Encrypt是免费并且开源的CA,由 Mozilla,思科,Akamai,IdenTrust和EFF等组织发起的,现由Linux基金会托管。
- 自动完成验证和更新
- 为了以后方便改二级域名,使用通配符证书更灵活~
环境
这是我的服务器的环境,其他环境需要根据实际环境变通一下.
- Debian 9(stretch)
- Certbot(官网首推的ACME Client,其他工具点击这里)
- Nginx
获取证书
通配符证书
生成通配符证书,只能使用DNS的方式来验证(txt记录)
- 生成证书
这里有个问题就是如果只申请*.xxx.com证书,xxx.com是不属于这个证书的,所以我申请的时候域名写了两个
1 | certbot certonly --email 邮箱 -d *.xxx.com -d xxx.com --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory |
说明:
--manual
表示手动交互模式
-d
主机名
--preferred-challenges dns
使用 DNS 方式校验域名所有权
--server
Let’s Encrypt ACME v2 版本使用的服务器不同于 v1 版本,需要显示指定。
接下来根据提示,会让我们为此域名设置一个_acme-challenge的txt解析,设置完成后我们等待片刻,解析生效后再继续下一步。
!!!这里重点提示,如果一次申请的时候写了多个域,每次的txt值都是不一样的,可以同时设置多个txt,建议使用dig查询txt是否生效再继续(dig -t txt _acme-challenge.xxx.com
),否则会获取证书失败的。
最后成功后,会在/etc/letsencrypt/live/下生成当前域名的文件夹(多个证书同一个域可能会重命名),有4个文件(都是链接archive的文件的):
1 | cert.pem - Apache服务器端证书 |
Nginx环境,只需要用到fullchain.pem和privkey.pem两个证书文件
SAN证书/单域名证书
- 安装Certbot,较新点的发行版应该都有certbot,可以直接安装
1
apt-get install certbot
- 域名DNS解析要把域名指向当前ip
- 假设当前要准备的域名有 domainA.com, www.domainA.com,root目录在/var/www/root
- 开始申请证书证书申请成功后会提示”Congratulations!balabala…”,后面会有证书的文件路径,以及证书到期时间。
1
certbot certonly --webroot -w /var/www/root -d domainA.com -d www.domainA.com
证书的续期
命令certbot renew
完成续期,默认只更新30天内到期的证书,所以如果没到期就执行可能会有提示: No renewals were attempted.如果确实要更新,可以执行certbot renew --force-renew
通配符证书续期
通配证书只能通过 dns 的方式验证域名归属,如果要自动renew, 我们需要通过脚本自动完成验证 –manual-auth-hook 设定验证脚本,否则无法自动更新
certbot默认是支持部分dns服务商的dns自动设置的,如cloudflare, Google.但是我是阿里云,可以使用au.sh来完成自动续期, 后面再试吧,暂时先手动更新好了
crontab自动续期
我的服务器(Debian 9)上安装完成certbot后,定时任务添加了两个,systemd的timer和crontab.
crontab的任务(/etc/cron.d/certbot
)会判断当前系统如果是systemd就不执行renew.默认的应该是每天都会renew,我们手动修改一下,改成每10天renew一次
crontab的修改:(另外完成续期后如果需要reload nginx可以使用certbot -q renew --renew-hook "systemctl reload nginx"
)
1 | 0 3 */15 * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew --renew-hook "systemctl reload nginx" |
systemd的修改(这里如果修改renew参数需要修改文件/lib/systemd/system/certbot.service
):
1 | # 修改文件/lib/systemd/system/certbot.timer |
说明
- 有的文章会说用
certbot-auto
,和certbot
相比,certbot-auto
执行时会自动安装依赖,并且自动更新,如果是通过apt
或yum
等系统的包管理工具安装的,不建议使用 - certbot有两种方式生成证书,推荐使用webroot方式,不会停止当前的web server.
- standalone 方式: certbot 会自己运行一个web server 来进行验证。如果我们自己的服务器上已经有 web server 正在运行 (比如 Nginx 或 Apache ),用 standalone 方式的话需要先关掉它,以免冲突。
- webroot 方式: certbot 会利用现有的 web server,在其 web root目录下创建隐藏文件, Let’s Encrypt 服务端会通过域名来访问这些隐藏文件,以确认你的确拥有对应域名的控制权。
- Let’s Encrypt目前还不支持申请通配符域名证书,据说18年2月份会上线这部分功能
- ~~ Let’s Encrypt目前还不支持申请通配符域名证书,据说18年2月份会上线这部分功能 ~~
- 官方说明:如果您在创建帐户时向 Let’s Encrypt 提供了电子邮件地址,我们会在您的证书即将需要续期时自动向您发送到期通知。我们会在您的证书到期前 20 天发送第一个通知,并在其到期前 10 天和 1 天发送更多通知。