1. 将网站接入 CDN
  2. 使用 acme.sh 配置 HTTPS
    1. 安装 acme.sh
    2. acme.sh 的使用
    3. 使用 DNS API 实现全自动
    4. 修改 nginx 配置
  3. 进一步的安全配置

这篇笔记记录给网站套上 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 \
--yes-I-know-dns-manual-mode-enough-go-ahead-please

acme.sh 会生成相应的解析记录显示出来, 在你的域名管理面板中添加这条 txt 记录。等待解析完成之后,重新生成证书:

acme.sh  --renew -d example.com \
--yes-I-know-dns-manual-mode-enough-go-ahead-please

安装证书:

acme.sh --install-cert -d example.com \
--key-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "sudo service nginx force-reload"

这个命令只需要执行一次,你提供的参数会被记录下来,在下次 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"
export DP_Key="sADDsdasdgdsf"

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 \
--key-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "sudo service nginx force-reload"

完成以上三步后,你的证书将会自动更新,无需更多人工干预。

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 {
listen 443 ssl http2;
server_name example.com;

ssl_certificate /path/to/keyfile/in/nginx/key.pem;
ssl_certificate_key /path/to/fullchain/nginx/cert.pem;
ssl_dhparam /path/to/keyfile/in/nginx/dhparam.pem;
}

执行:

sudo service nginx force-reload

现在,你的网站已经启用了 HTTPS。

进一步的安全配置

为了阻止用户通过 IP 直接连接到你的服务器,你可以让防火墙只放行从 Cloudflare 服务器传来的流量,Cloudflare 的 IP 列表可以在这里获得。通过下面的脚本快速添加规则(默认使用 UFW):

cloudflare.sh
#!/bin/zsh
for i in curl https://www.cloudflare.com/ips-v4; do ufw allow proto tcp from $i to any port 80; done

你也可以通过 API 获得 json 格式的 IP 列表,API 返回的数据中包含一个 etag 项用来标识 IP 是否发生改变,这对编写脚本来说十分有用。详细信息见这里


因为着凉,恰逢流感季节,所以感冒。因此这篇笔记迟到了很多天。