Get a Free SSL Certificate with Cloudflare DNS Service
最近玩了下Cloudflare,其丰富的免费功能,令我印象深刻。虽然其提供了一键开启的免费SSL服务,但是开发测试环境还是需要用到SSL证书。这里记录一下获取SSL证书的配置。
1. 准备
需要先准备好以下三个方面:
域名
- 可直接购买,一般按年收费。
- eu.org提供免费域名,但申请域名的审核时长不定。
DNS
- Cloudflare提供免费DNS服务,需要先免费注册账户。
- Cloudflare设置域名解析。
证书机构。推荐一直在使用“Let's Encrypt”。其具有以下三个优点:
- 基于DNS服务验证域名所有权。通过在DNS添加指定的TXT记录实现验证。
- 支持通配符证书。
- 客户端程序Certbot实现证书申请和续签。
参考:
- [[记录]使用Certbot与Cloudflare插件申请通配符证书](https://juejin.cn/post/7069995574266691614)
2. Cloudflare API Token
- 登录Cloudflare并进入Dashboard:https://dash.cloudflare.com/
- 点击右上角的用户头像,再点“My profile”。
- 点左边菜单的“API Tokens”,再点右边的“Create Token”按钮。
- 找到“Edit zone DNS”的行,点击右边的“Use template”按钮。
- “Token name”填写Token名称,“Zone Resources”选“Include”、“Specific zone”、指定的域名,再点下面的“Continue to summary”按钮。
- 最后点“Create Token”,就显示所申请的API Token了。由于只显示一次,要保存好。
3. Certbot
这里以Debian 12为例,安装、配置和使用Certbot。
Certbot官方网站:Certbot
3.1 安装
Certbot官方安装教程是使用snapd
,但Debian 12的软件仓库已提供Certbot,以及cloudflare的插件。
sudo apt update
sudo apt install certbot python3-certbot-dns-cloudflare
3.2 配置
编辑文件/etc/letsencrypt/certbot-dns-cloudflare-credentials.ini
,填写以下内容。其中“_cloudflare_api_token_”需要替换为第2步申请到的Cloudflare API Token。
# Cloudflare API token, get SSL for foxail.eu.org
dns_cloudflare_api_token=_cloudflare_api_token_
保存后,设置该文件的权限:
sudo chmod 600 /etc/letsencrypt/certbot-dns-cloudflare-credentials.ini
3.3 申请SSL证书
执行以下命令申请SSL证书。其中:
example.com
需要改为实际的域名。- 选项
--key-type ecdsa
使用ECDSA密钥。ECDSA使用更短的密钥就可实现和RSA相同的安全级别,意味着更高的效率。
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/certbot-dns-cloudflare-credentials.ini \
--key-type ecdsa \
--domain "example.com,*.example.com"
第一次执行会提示域名所有权验证失败,按所给提示,在DNS添加相关的TXT记录即可。即添加DNS记录,类型为“TXT”,名称为“_acme-challenge”,内容为提示所给的。添加成功后,再执行一次刚才的命令。
执行命令后会提示一些问题:
- 要求输入邮箱,可以跳过。输入邮箱的话,可以接收到证书过期或安全问题的通知。
- 同意服务条款,输入Y并按回车。
- 是否订阅电子前沿基金会的邮件,看需要选Y或N。
成功后会提示证书的存储位置。
3.4 更新SSL证书
第一次成功执行Certbot后,会自动创建定时任务/etc/cron.d/certbot
,实现自动更新证书,该文件的内容如下:
# /etc/cron.d/certbot: crontab entries for the certbot package
#
# Upstream recommends attempting renewal twice a day
#
# Eventually, this will be an opportunity to validate certificates
# haven't been revoked, etc. Renewal will only occur if expiration
# is within 30 days.
#
# Important Note! This cronjob will NOT be executed if you are
# running systemd as your init system. If you are running systemd,
# the cronjob.timer function takes precedence over this cronjob. For
# more details, see the systemd.timer manpage, or use systemctl show
# certbot.timer.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew
3.5 删除域名
无效的域名会导致所有证书更新失败。执行以下Shell脚本可以删除指定域名(以www.example.com
为例)的相关配置:
sudo rm -rf /etc/letsencrypt/live/www.example.com/
sudo rm -rf /etc/letsencrypt/archive/www.example.com/
sudo rm /etc/letsencrypt/renewal/www.example.com.conf