这篇笔记记录给网站套上 Cloudflare 并配置 HTTPS 的过程,以及一些进阶的安全配置。这里默认你已经拥有一个域名,且使用 Cloudflare Partner。本笔记使用笨牛网和 DNSPod.
将网站接入 CDN
登录笨牛网,在管理面板中添加你的域名,在解析设置中添加你要解析的三级域名(也可以直接解析主域名)选择 CNAME 接入,这些设置和普通的 DNS 解析相同,因此不再展开。稍后你会得到一个用于 CNAME 的目标域名,比如:blog.diliu.me.cdn.cloudflare.com.
在 DNSPod 中添加你的域名,将 blog.diliu.me 通过 CNAME 指向 blog.diliu.me.cdn.cloudflare.com,等待一段时间后在浏览器访问 blog.diliu.me,如果你的配置正确,你会看到你的主页。至此,你的网站已经接入 CDN 了。
使用 acme.sh 配置 HTTPS
本部分参考官方文档。
虽然 Cloudflare 可以提供免费的证书,但如果本地不做 HTTPS 配置的话,Cloudflare 到服务器的流量将以 HTTP 传输。下面将对本地配置 HTTPS.
安装 acme.sh
安装:
curl https://get.acme.sh | sh -s email=my@example.com # 替换成你的email |
重新加载 zsh:
source ~/.zshrc |
acme.sh 的使用
手动 DNS 获取 Let’s Encrypt 证书:
acme.sh --issue --dns -d example.com \ |
acme.sh 会生成相应的解析记录显示出来, 在你的域名管理面板中添加这条 txt 记录。等待解析完成之后,重新生成证书:
acme.sh --renew -d example.com \ |
安装证书:
acme.sh --install-cert -d example.com \ |
这个命令只需要执行一次,你提供的参数会被记录下来,在下次 renew 时将会被自动调用。
第一次执行可能会让你输入密码,使用 sudo visudo 编辑 sudoer,让 reloadcmd 不用输入密码,新增:
ubuntu ALL=(ALL) NOPASSWD: /usr/sbin/service nginx force-reload |
⚠:ubuntu 应该替换成执行 acme.sh 的用户。
更多使用方式参见官方文档。
使用 DNS API 实现全自动
1. 获取 DNSPod Token
登录账号后,在这里点击创建密钥。获取 ID 和 Token 后执行:
export DP_Id="1234" |
2. 自动获取证书
执行下面的命令即可自动获取 Let’s Encrypt 证书:
acme.sh --issue --dns dns_dp -d example.com |
对于 Let’s Encrypt 的泛域名证书,DNS 验证是必须的,这也是本笔记只介绍 DNS 验证的原因。获取泛域名证书:
acme.sh --issue --dns dns_dp -d example.com -d *.example.com |
3. 安装证书
acme.sh --install-cert -d example.com \ |
完成以上三步后,你的证书将会自动更新,无需更多人工干预。
acme.sh 的迁移
acme.sh 生成和使用的文件全部保存在 ~/.acme.sh 下,因此它的迁移只需要把该文件夹打包后上传到目标服务器即可,然后在目标服务器执行:
.acme.sh/acme.sh --install |
即可完成迁移。如果你对 API Token 设置了 IP 白名单,别忘了放行新机器的 IP🙃.
修改 nginx 配置
生成 DHE 参数文件:
openssl dhparam -out /path/to/keyfile/in/nginx/dhparam.pem 2048 |
向 nginx 配置文件添加:
server { |
执行:
sudo service nginx force-reload |
现在,你的网站已经启用了 HTTPS。
进一步的安全配置
为了阻止用户通过 IP 直接连接到你的服务器,你可以让防火墙只放行从 Cloudflare 服务器传来的流量,Cloudflare 的 IP 列表可以在这里获得。通过下面的脚本快速添加规则(默认使用 UFW):
|
你也可以通过 API 获得 json 格式的 IP 列表,API 返回的数据中包含一个 etag 项用来标识 IP 是否发生改变,这对编写脚本来说十分有用。详细信息见这里。
因为着凉,恰逢流感季节,所以感冒。因此这篇笔记迟到了很多天。