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
2
3
4
cert.pem - Apache服务器端证书
chain.pem - Apache根证书和中继证书
fullchain.pem - Nginx所需要ssl_certificate文件
privkey.pem - 安全证书KEY文件

Nginx环境,只需要用到fullchain.pem和privkey.pem两个证书文件

SAN证书/单域名证书

  • 安装Certbot,较新点的发行版应该都有certbot,可以直接安装
    1
    apt-get install certbot
  • 域名DNS解析要把域名指向当前ip
  • 假设当前要准备的域名有 domainA.com, www.domainA.com,root目录在/var/www/root
  • 开始申请证书
    1
    certbot certonly --webroot -w /var/www/root -d domainA.com -d www.domainA.com
    证书申请成功后会提示”Congratulations!balabala…”,后面会有证书的文件路径,以及证书到期时间。

证书的续期

命令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
2
3
4
5
6
7
# 修改文件/lib/systemd/system/certbot.timer
# 删除OnCalendar这行
# 在Timer字段添加以下两行(systemd启动后1小时执行,之后每10天执行一次)
OnStartupSec=1h
OnUnitActiveSec=10d
# 重新加载systemd的配置
systemctl daemon-reload

说明

  • 有的文章会说用certbot-auto,和certbot相比,certbot-auto执行时会自动安装依赖,并且自动更新,如果是通过aptyum等系统的包管理工具安装的,不建议使用
  • 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 天发送更多通知。

参考链接