6月开始,CF 改变对申请 CFP 的审核机制,loc上所有售卖 CFP 一瞬售罄。
不过,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-----
MIIGBjCCA/CgAwIBAgIIV5G6lVbCLmEwCwYJKoZIhvcNAQENMIGQMQswCQYDVQQG
EwJVUzEZMBcGA1UEChMQQ2xvdWRGbGFyZSwgSW5jLjEUMBIGA1UECxMLT3JpZ2lu
IFB1bGwxFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xEzARBgNVBAgTCkNhbGlmb3Ju
aWExIzAhBgNVBAMTGm9yaWdpbi1wdWxsLmNsb3VkZmxhcmUubmV0MB4XDTE1MDEx
MzAyNDc1M1oXDTIwMDExMjAyNTI1M1owgZAxCzAJBgNVBAYTAlVTMRkwFwYDVQQK
ExBDbG91ZEZsYXJlLCBJbmMuMRQwEgYDVQQLEwtPcmlnaW4gUHVsbDEWMBQGA1UE
BxMNU2FuIEZyYW5jaXNjbzETMBEGA1UECBMKQ2FsaWZvcm5pYTEjMCEGA1UEAxMa
b3JpZ2luLXB1bGwuY2xvdWRmbGFyZS5uZXQwggIiMA0GCSqGSIb3DQEBAQUAA4IC
DwAwggIKAoICAQDdsts6I2H5dGyn4adACQRXlfo0KmwsN7B5rxD8C5qgy6spyONr
WV0ecvdeGQfWa8Gy/yuTuOnsXfy7oyZ1dm93c3Mea7YkM7KNMc5Y6m520E9tHooc
f1qxeDpGSsnWc7HWibFgD7qZQx+T+yfNqt63vPI0HYBOYao6hWd3JQhu5caAcIS2
ms5tzSSZVH83ZPe6Lkb5xRgLl3eXEFcfI2DjnlOtLFqpjHuEB3Tr6agfdWyaGEEi
lRY1IB3k6TfLTaSiX2/SyJ96bp92wvTSjR7USjDV9ypf7AD6u6vwJZ3bwNisNw5L
ptph0FBnc1R6nDoHmvQRoyytoe0rl/d801i9Nru/fXa+l5K2nf1koR3IX440Z2i9
+Z4iVA69NmCbT4MVjm7K3zlOtwfI7i1KYVv+ATo4ycgBuZfY9f/2lBhIv7BHuZal
b9D+/EK8aMUfjDF4icEGm+RQfExv2nOpkR4BfQppF/dLmkYfjgtO1403X0ihkT6T
PYQdmYS6Jf53/KpqC3aA+R7zg2birtvprinlR14MNvwOsDOzsK4p8WYsgZOR4Qr2
gAx+z2aVOs/87+TVOR0r14irQsxbg7uP2X4t+EXx13glHxwG+CnzUVycDLMVGvuG
aUgF9hukZxlOZnrl6VOf1fg0Caf3uvV8smOkVw6DMsGhBZSJVwao0UQNqQIDAQAB
o2YwZDAOBgNVHQ8BAf8EBAMCAAYwEgYDVR0TAQH/BAgwBgEB/wIBAjAdBgNVHQ4E
FgQUQ1lLK2mLgOERM2pXzVc42p59xeswHwYDVR0jBBgwFoAUQ1lLK2mLgOERM2pX
zVc42p59xeswCwYJKoZIhvcNAQENA4ICAQDKDQM1qPRVP/4Gltz0D6OU6xezFBKr
LWtDoA1qW2F7pkiYawCP9MrDPDJsHy7dx+xw3bBZxOsK5PA/T7p1dqpEl6i8F692
g//EuYOifLYw3ySPe3LRNhvPl/1f6Sn862VhPvLa8aQAAwR9e/CZvlY3fj+6G5ik
3it7fikmKUsVnugNOkjmwI3hZqXfJNc7AtHDFw0mEOV0dSeAPTo95N9cxBbm9PKv
qAEmTEXp2trQ/RjJ/AomJyfA1BQjsD0j++DI3a9/BbDwWmr1lJciKxiNKaa0BRLB
dKMrYQD+PkPNCgEuojT+paLKRrMyFUzHSG1doYm46NE9/WARTh3sFUp1B7HZSBqA
kHleoB/vQ/mDuW9C3/8Jk2uRUdZxR+LoNZItuOjU8oTy6zpN1+GgSj7bHjiy9rfA
F+ehdrz+IOh80WIiqs763PGoaYUyzxLvVowLWNoxVVoc9G+PqFKqD988XlipHVB6
Bz+1CD4D/bWrs3cC9+kk/jFmrrAymZlkFX8tDb5aXASSLJjUjcptci9SKqtI2h0J
wUGkD7+bQAr+7vr8/R+CBmNMe7csE8NeEX6lVMF7Dh0a1YKQa6hUN18bBuYgTMuT
QzMmZpRpIBB321ZBlcnlxiTJvWxvbCPHKHj20VwwAz7LONF59s84ZsOqfoBv8gKM
s0s5dsq5zpLeaw==
-----END CERTIFICATE-----

公钥文件也可以在这里下载到.

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

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