CTFd04 - Cloudflare為網頁掛上SSL

Zerocatw

前言

到上一篇其實就可以正式使用CTFd平台了,不過我不想要讓我的CTFd首頁顯示「不安全」
所以這篇就用來記錄怎麼為我們的CTFd掛上SSL憑證

前置

  1. 一個Cloudflare帳號
  2. 一個域名,我是在GoDaddy 買了.site的域名,首次一年40元XD
    ps. 這個域名要Cloudflare支援的,可從官網的頂層網域名稱原則 看到
    比如說Ctrl+F查詢com,發現有在上面,所以這個頂級域名是支援的
    image

完成以上事情後,就可以託管Cloudflare幫我們處理全部事情!

掛上SSL憑證

流程 :

  1. 註冊網域
  2. 為域名設置Cloudflare DNS
  3. 生成原點憑證
  4. nginx安裝SSL

註冊網域

到Cloudflare,登入後右邊點選網域註冊->移轉網域
image

點選開始使用,輸入購買的網域名稱
image

點選繼續,因為有點窮,所以點免費方案就好,而且也夠用了XD,好了後按確認方案
image

之後按快速掃描並按繼續,往下滑後找到新的名稱伺服器(Nameservers),要把我們域名的Nameservers改成Cloudflare提供的
image

我的網域名稱註冊商是GoDaddy,所以到GoDaddy的Dashboard去調整設定
如果不確定自己域名的註冊商是誰的話,可以到ICANN WHOIS 輸入網域確認,往下滑到Registrar Information就可以看到了
image

到GoDaddy的Dashboard後,點選DNS->名稱伺服器
image

點選變更名稱伺服器->我要用自己的名稱伺服器
把Cloudflare給的兩個Nameservers貼上去,按儲存就ok了,成功變更
image

回到Cloudflare按繼續,等他啟用完成,雖然會說要等24hr,但通常都很快
看到使用中就ok了
image

為域名設置Cloudflare DNS

我們現在CTFd的網址應該會是一串ip,訪問後是長這樣
image

現在我想要把104.199.187.67綁到ctf.mlshctf.site上
先回到Cloudflare,左邊點選DNS->記錄,進到這裡
image

點選新增記錄,類型選A,名稱填ctf,IPv4填104.199.187.67,按儲存就ok了
image

這邊記得代換自己的名稱跟IPv4喔,不要照著我填XD
如果是想要綁主網域(mlshctf.site),在名稱填@就ok了
image

接下來訪問ctf.mlshctf.site,發現可以成功訪問惹!
image

但網頁還是顯示不安全,我們可以先回到Cloudflare,左邊點選SSL->概觀
把「關閉」變成「彈性」
image

之後到左邊SSL->邊緣憑證,把「一律使用 HTTPS」打開
image

回到網頁後就會發現已建立安全連線了!
image

看起來我們已經掛上憑證了,但那只有用戶到Cloudflare之間有進行加密而已,而Cloudflare到伺服器間還是沒有進行加密的,所以我們要來為這段掛上憑證,也就是啟用完整(嚴格)

  • 彈性
    image

  • 完整(嚴格)
    image

生成原點憑證

到Cloudflare -> SSL -> 原始伺服器
點選建立憑證
接下來可以依個人需求去做改動,我這邊是都不動,好了按建立
會拿到憑證跟KEY
image

把這兩個變成檔案放到~/CTFd/conf/nginx
我這裡取名為
原點憑證 -> origin.pem
私密金鑰 -> private.pem

此時ls,應該會有3個檔案
image

nginx安裝SSL

先到~/CTFd/conf/nginx
輸入指令vim http.conf
會有一段程式碼長這樣

1
2
3
4
5
6
server {
listen 80;

gzip on;

client_max_body_size 4G;

把這裡改成

1
2
3
4
5
server {
listen 443 ssl;
server_name ctf.mlshctf.site; #你的網域名稱
ssl_certificate /certificates/origin.pem;
ssl_certificate_key /certificates/private.pem;

儲存後退出
整個http.conf會長這樣

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
36
37
38
39
40
41
42
43
44
45
46
worker_processes 4;

events {
worker_connections 1024;
}

http {
# Configuration containing list of application servers
upstream app_servers {
server ctfd:8000;
}

server {

listen 443 ssl;
server_name ctf.mlshctf.site; #你的網域名稱
ssl_certificate /certificates/origin.pem;
ssl_certificate_key /certificates/private.pem;
client_max_body_size 4G;

# Handle Server Sent Events for Notifications
location /events {
proxy_pass http://app_servers;
proxy_set_header Connection '';
proxy_http_version 1.1;
chunked_transfer_encoding off;
proxy_buffering off;
proxy_cache off;
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;
proxy_set_header X-Forwarded-Host $server_name;
}

# Proxy connections to the application servers
location / {
proxy_pass http://app_servers;
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;
proxy_set_header X-Forwarded-Host $server_name;
}
}
}

再回到~/CTFd 目錄下
輸入指令vim docker-compose.yml
往下滑到nginx的部分會看到

1
2
3
4
5
6
7
8
9
nginx:
image: nginx:stable
restart: always
volumes:
- ./conf/nginx/http.conf:/etc/nginx/nginx.conf
ports:
- 80:80
depends_on:
- ctfd

把它改成以下

1
2
3
4
5
6
7
8
9
10
11
nginx:
image: nginx:stable
restart: always
volumes:
- ./conf/nginx/http.conf:/etc/nginx/nginx.conf
- ./conf/nginx/origin.pem:/certificates/origin.pem:ro
- ./conf/nginx/private.pem:/certificates/private.pem:ro
ports:
- 443:443
depends_on:
- ctfd

整個docker-compose.yml會長這樣

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
version: '2'

services:
ctfd:
build: .
user: root
restart: always
ports:
- "8000:8000"
environment:
- UPLOAD_FOLDER=/var/uploads
- DATABASE_URL=mysql+pymysql://ctfd:ctfd@db/ctfd
- REDIS_URL=redis://cache:6379
- WORKERS=1
- LOG_FOLDER=/var/log/CTFd
- ACCESS_LOG=-
- ERROR_LOG=-
- REVERSE_PROXY=true
volumes:
- .data/CTFd/logs:/var/log/CTFd
- .data/CTFd/uploads:/var/uploads
- .:/opt/CTFd:ro
depends_on:
- db
networks:
default:
internal:

nginx:
image: nginx:stable
restart: always
volumes:
- ./conf/nginx/http.conf:/etc/nginx/nginx.conf
- ./conf/nginx/origin.pem:/certificates/origin.pem:ro
- ./conf/nginx/private.pem:/certificates/private.pem:ro
ports:
- 443:443
depends_on:
- ctfd

db:
image: mariadb:10.11
restart: always
environment:
- MARIADB_ROOT_PASSWORD=ctfd
- MARIADB_USER=ctfd
- MARIADB_PASSWORD=ctfd
- MARIADB_DATABASE=ctfd
- MARIADB_AUTO_UPGRADE=1
volumes:
- .data/mysql:/var/lib/mysql
networks:
internal:
# This command is required to set important mariadb defaults
command: [mysqld, --character-set-server=utf8mb4, --collation-server=utf8mb4_unicode_ci, --wait_timeout=28800, --log-warnings=0]

cache:
image: redis:4
restart: always
volumes:
- .data/redis:/data
networks:
internal:

networks:
default:
internal:
internal: true

之後重新docker-compose up -d
done結束後docker ps確認是否有開啟443port
image

出現這樣就ok了
回到Cloudflare -> SSL -> 概觀
把彈性換成完整(嚴格)
之後再訪問一次CTFd,如果發現可以成功訪問,就代表成功設定惹
image

想在更確定的話,可以把SSL關掉看看,會發現會跳出Error code 521
image

參考資料

Cloudflare介紹 : [Day5] SSL/TLS — 30 天入門 Cloudflare
Cloudflare的優勢 : 為什麼要託管到Cloudflare
Cloudflare掛SSL : 使用Cloudflare幫你的網站掛上SSL憑證與CDN
CTFd的nginx.conf範例 : mishrasunny174/nginx.conf

後記

CTFd設置到這應該就結束了!感謝學校提出想要辦校內的CTF小比賽,透過架設平台學到了好多咚咚

  • Title: CTFd04 - Cloudflare為網頁掛上SSL
  • Author: Zerocatw
  • Created at : 2024-07-23 22:10:10
  • Link: https://zerocatw.github.io/2024/07/23/CTFd04 - Cloudflare為網頁掛上SSL/
  • License: This work is licensed under CC BY-NC-SA 4.0.