— Update —–

  1. 本文之前 origin-pull-ca.pem 有效期至 2020.1.11。目前,本文中的 origin-pull-ca.pem 已更新
  2. 本站 CFP 无法添加修改域名记录的问题已经修复,详见 hostloc贴子.对于使用 docker 的小伙伴,只需要运行 docker pull ze3kr/cloudflare,更新镜像,重新启动容器即可。

— End ———

2019年6月开始,CF 改变对申请 CFP 的审核机制,loc 上所有售卖 CFP 一瞬售罄。
还好,2019年7月12日,我终于还在loc上收到了CFP账号,收到后注意修改邮箱和密码。

密码只能通过登录时重置密码才能修改。

收号可能是最难的一步,只要收到号了,搭建就很简单了。

本站的 CFP 面板地址:
https://cfp.meow.page

Cloudflare Partner 的好处

对于 Free Plan 而言,相比 Cloudflare 官网用 NS 接入域名,Partner 可以使用 CNAME 方式接入域名,CNAME 方式是在官网 Pro Plan (20🔪/mo)级以上才会提供的。

使用 CNAME 接入,而无需更改 NS,可以更加方便地使用同时其它 DNS 服务提供商,甚至搭配 GeoDNS 分区解析。

面板集成

目前已知有两种开源的面板:

  1. Cloudflare-CNAME-Setup
  1. CFPMP

这里我选第一种,因为第一种提供 docker 部署,star 数也远超第二种

部署 Cloudflare-CNAME-Setup

使用 docker 部署面板

参考:https://github.com/ZE3kr/Cloudflare-CNAME-Setup/wiki/%E5%AE%89%E8%A3%85

如果没有安装docker,使用以下命令安装:

1
curl -sSL https://get.docker.com/ | sh

启动docker:

1
2
3
4
5
6
docker run -d \
-e HOST_KEY="<api-key>" \
-e HOST_MAIL="<cfp-mail>"\
-e TITLE="<dashboard-title>"\
-p <host-port>:80\
ze3kr/cloudflare

<host-port>这里我填写为127.0.0.1:5000
因为我需要用 nginx 反向代理一层。

使用 nginx 支持 ssl

因为 meow.page 在部署本博客的时候,使用了 gitlab pages,在 Cloudflare 的 Crypto 标签的 SSL 配置为 Full,这个配置对此域名的全局生效,不能对单独的子域名进行配置。

SSL 配置有几种:

  • Off
    访客无法通过 HTTPS 访问站点,HTTPS 流量会被重定向到 HTTP
  • Flexible SSL
    源站无需配置 HTTPS,由 Cloudflare 在 CDN 边缘提供 HTTPS,CDN 到源站仍然是 HTTP
  • Full SSL
    需要源站配置 HTTPS,但是证书可以不匹配域名,或者是自签证书。Cloudflare 通过 HTTPS 连接到源站,但是不验证证书。
  • Full (strict)
    在 Full 的基础上,Cloudflare 连接源站时需要验证证书是否有效。

我又不想把 CFP 挂在其他的域名下,所以通过 nginx 提供一个证书。
你可能会想,那么直接 nginx 已经提供了 Web 访问,这不就完了吗?
因为需要隐藏源站 IP,所以前面还是要套个 CDN。Nginx 配置的证书由 Cloudflare 签发,仅由 Cloudflare 信任,用于 CDN 通过 HTTPS 连接源站。

这样还有个好处就是,Cloudflare 签发的 Origin Certificate,有效期最长可以为 15 年,而 CDN 边缘服务器上使用的证书,CF 会自动续期,所以我们不用担心证书过期的问题。(如果 nginx 使用 lets encrypt 证书,每三个月需要续签,没有配置好的话,https过期了被访问到很尴尬)

nginx 这边的配置参考:https://www.digitalocean.com/community/tutorials/how-to-host-a-website-using-cloudflare-and-nginx-on-ubuntu-16-04

具体配置步骤如下

  1. 创建 Origin Certificates
    在 Cloudflare 面板的 Crypto 标签页,往下滑到 Origin Certificates 的部分,点击 Create Certificate 按钮:

选择让 Cloudflare 生成私钥和 CSR,证书的类型选择 RSA

列出需要签署证书的域名:
比如我的是 cfp.meow.page

然后会看到 Origin Certificate 和私钥

我们使用服务器上的 /etc/ssl/certs 目录来存放源站的证书.
/etc/ssl/private 目录来存放私钥文件.
这两个目录都是服务器上已经存在的

Origin Certificate 我们放在
/etc/ssl/certs/cert.pem

1
sudo vim /etc/ssl/certs/cert.pem

接着是私钥,放在 /etc/ssl/private/key.pem :

1
sudo vim /etc/ssl/private/key.pem

  1. 在 Nginx 安装 Origin CA certificate

安装 nginx

1
2
3
4
# for debian/ubuntu
apt install nginx
# for centos/fedora
yum install nginx

Nginx 会在安装的时候创建一个默认的服务器配置块. 如果存在这个默认的配置,你需要将它移除, 因为你需要as you’ve already configured a custom server block for your domain:

1
sudo rm /etc/nginx/sites-enabled/default

sudo nano /etc/nginx/sites-available/example.com

注意查看nginx的主配置文件
cat /etc/nginx/nginx.conf

1
2
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

一般来说其中有两行如上的配置
说明 nginx 会加载这两个目录下的配置文件

那么你应该在

1
/etc/nginx/conf.d/*.conf

或者

1
/etc/nginx/sites-enabled/*

写入配置

我一般这样写配置

1
vim /etc/nginx/sites-enabled/example.com

example.com 在本例是 cfp.meow.page

配置内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server {
listen 80;
listen [::]:80;
server_name cfp.meow.page;
return 302 https://$server_name$request_uri;
}

server {

# SSL configuration

listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl on;
ssl_certificate /etc/ssl/certs/cert.pem;
ssl_certificate_key /etc/ssl/private/key.pem;

server_name cfp.meow.page;

location / {
try_files $uri $uri/ =404;
}
}

  1. 配置 Cloudflare 拉取(pull)源站时的公钥

Origin CA certificate 的作用是,帮助 Cloudflare 验证对话的目标是正确的源站服务器。但是源站 Nginx 服务器如何验证它对话的另一边就是 Cloudflare 呢?
所以需要使用 TLS 客户端验证(Client Authentication)。

这里可以顺便提一下,非对称加密中,公钥和私钥为一对。
1)公钥加密后只能使用配对的私钥才能解密
2)私钥加密,这个过程称为签名,可以使用公钥来验证签名。

这里正是使用的第二条,我们使用 cf 提供的公钥来验证发送消息的来方是否为 cf。

在这样的 客户端 TLS 握手验证中,两边都提供了用于验证的证书。源站服务器已经配置为,仅接受来自 Cloudflare 的有效证书。没有通过 Cloudflare 的请求将会被丢弃,因为他们没有 Cloudflare 的证书。这意味着,攻击者无法绕过 Cloudflare 的安全措施,并直接连接到您的 Nginx 服务器。

Cloudflare 目前提供的由 CA 签署的证书如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
-----BEGIN CERTIFICATE-----
MIIGCjCCA/KgAwIBAgIIV5G6lVbCLmEwDQYJKoZIhvcNAQENBQAwgZAxCzAJBgNV
BAYTAlVTMRkwFwYDVQQKExBDbG91ZEZsYXJlLCBJbmMuMRQwEgYDVQQLEwtPcmln
aW4gUHVsbDEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzETMBEGA1UECBMKQ2FsaWZv
cm5pYTEjMCEGA1UEAxMab3JpZ2luLXB1bGwuY2xvdWRmbGFyZS5uZXQwHhcNMTkx
MDEwMTg0NTAwWhcNMjkxMTAxMTcwMDAwWjCBkDELMAkGA1UEBhMCVVMxGTAXBgNV
BAoTEENsb3VkRmxhcmUsIEluYy4xFDASBgNVBAsTC09yaWdpbiBQdWxsMRYwFAYD
VQQHEw1TYW4gRnJhbmNpc2NvMRMwEQYDVQQIEwpDYWxpZm9ybmlhMSMwIQYDVQQD
ExpvcmlnaW4tcHVsbC5jbG91ZGZsYXJlLm5ldDCCAiIwDQYJKoZIhvcNAQEBBQAD
ggIPADCCAgoCggIBAN2y2zojYfl0bKfhp0AJBFeV+jQqbCw3sHmvEPwLmqDLqynI
42tZXR5y914ZB9ZrwbL/K5O46exd/LujJnV2b3dzcx5rtiQzso0xzljqbnbQT20e
ihx/WrF4OkZKydZzsdaJsWAPuplDH5P7J82q3re88jQdgE5hqjqFZ3clCG7lxoBw
hLaazm3NJJlUfzdk97ouRvnFGAuXd5cQVx8jYOOeU60sWqmMe4QHdOvpqB91bJoY
QSKVFjUgHeTpN8tNpKJfb9LIn3pun3bC9NKNHtRKMNX3Kl/sAPq7q/AlndvA2Kw3
Dkum2mHQUGdzVHqcOgea9BGjLK2h7SuX93zTWL02u799dr6Xkrad/WShHchfjjRn
aL35niJUDr02YJtPgxWObsrfOU63B8juLUphW/4BOjjJyAG5l9j1//aUGEi/sEe5
lqVv0P78QrxoxR+MMXiJwQab5FB8TG/ac6mRHgF9CmkX90uaRh+OC07XjTdfSKGR
PpM9hB2ZhLol/nf8qmoLdoD5HvODZuKu2+muKeVHXgw2/A6wM7OwrinxZiyBk5Hh
CvaADH7PZpU6z/zv5NU5HSvXiKtCzFuDu4/Zfi34RfHXeCUfHAb4KfNRXJwMsxUa
+4ZpSAX2G6RnGU5meuXpU5/V+DQJp/e69XyyY6RXDoMywaEFlIlXBqjRRA2pAgMB
AAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgECMB0GA1Ud
DgQWBBRDWUsraYuA4REzalfNVzjann3F6zAfBgNVHSMEGDAWgBRDWUsraYuA4REz
alfNVzjann3F6zANBgkqhkiG9w0BAQ0FAAOCAgEAkQ+T9nqcSlAuW/90DeYmQOW1
QhqOor5psBEGvxbNGV2hdLJY8h6QUq48BCevcMChg/L1CkznBNI40i3/6heDn3IS
zVEwXKf34pPFCACWVMZxbQjkNRTiH8iRur9EsaNQ5oXCPJkhwg2+IFyoPAAYURoX
VcI9SCDUa45clmYHJ/XYwV1icGVI8/9b2JUqklnOTa5tugwIUi5sTfipNcJXHhgz
6BKYDl0/UP0lLKbsUETXeTGDiDpxZYIgbcFrRDDkHC6BSvdWVEiH5b9mH2BON60z
0O0j8EEKTwi9jnafVtZQXP/D8yoVowdFDjXcKkOPF/1gIh9qrFR6GdoPVgB3SkLc
5ulBqZaCHm563jsvWb/kXJnlFxW+1bsO9BDD6DweBcGdNurgmH625wBXksSdD7y/
fakk8DagjbjKShYlPEFOAqEcliwjF45eabL0t27MJV61O/jHzHL3dknXeE4BDa2j
bA+JbyJeUMtU7KMsxvx82RmhqBEJJDBCJ3scVptvhDMRrtqDBW5JShxoAOcpFQGm
iYWicn46nPDjgTU0bX1ZPpTpryXbvciVL5RkVBuyX2ntcOLDPlZWgxZCBp96x07F
AnOzKgZk4RzZPNAxCXERVxajn/FLcOhglVAKo5H0ac+AitlQ0ip55D2/mf8o72tM
fVQ6VpyjEXdiIXWUq/o=
-----END CERTIFICATE-----

公钥文件也可以在这里下载到. (来源:https://support.cloudflare.com/hc/en-us/articles/204899617/

复制证书内容,创建文件,并粘贴进去。

1
sudo vim /etc/ssl/certs/cloudflare.crt

更新 Nginx 配置文件,来使用 TLS Authenticated Origin Pulls.

1
sudo nano /etc/nginx/sites-available/example.com

添加ssl_client_certificatessl_verify_client 配置块:

1
2
3
4
5
6
7
8
9
10
11
server {

# SSL configuration

listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl on;
ssl_certificate /etc/ssl/certs/cert.pem;
ssl_certificate_key /etc/ssl/private/key.pem;
ssl_client_certificate /etc/ssl/certs/cloudflare.crt;
ssl_verify_client on;

保存配置。

最后,在我服务器上的 nginx 配置/etc/nginx/sites-enabled/cfp.meow.page 如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
server {
listen 80;
listen [::]:80;
server_name cfp.meow.page;
return 301 https://$server_name$request_uri;
}
upstream cfp{
server 127.0.0.1:5000;
}
server {

# SSL configuration

listen 443;
listen [::]:443;
ssl on;
ssl_certificate /etc/ssl/certs/cert.pem;
ssl_certificate_key /etc/ssl/private/key.pem;
ssl_client_certificate /etc/ssl/certs/cloudflare.crt;
ssl_verify_client on;
server_name cfp.meow.page;

location / {
proxy_pass http://cfp/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For; $proxy_add_x_forwarded_for;
}
}

测试 nginx 配置文件是否有错误

1
nginx -t

没有错误后,使 nginx 重载配置

1
nginx -s reload

其他参考:

  1. https://momivps.com/305.html
  2. https://support.cloudflare.com/hc/en-us/articles/204899617/