CTFd04 - Cloudflare為網頁掛上SSL
前言
到上一篇其實就可以正式使用CTFd平台了,不過我不想要讓我的CTFd首頁顯示「不安全」
所以這篇就用來記錄怎麼為我們的CTFd掛上SSL憑證
前置
- 一個Cloudflare帳號
- 一個域名,我是在GoDaddy 買了.site的域名,首次一年40元XD
ps. 這個域名要Cloudflare支援的,可從官網的頂層網域名稱原則 看到
比如說Ctrl+F查詢com,發現有在上面,所以這個頂級域名是支援的

完成以上事情後,就可以託管Cloudflare幫我們處理全部事情!
掛上SSL憑證
流程 :
- 註冊網域
- 為域名設置Cloudflare DNS
- 生成原點憑證
- nginx安裝SSL
註冊網域
到Cloudflare,登入後右邊點選網域註冊->移轉網域

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

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

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

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

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

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

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

為域名設置Cloudflare DNS
我們現在CTFd的網址應該會是一串ip,訪問後是長這樣

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

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

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

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

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

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

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

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

完整(嚴格)

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

把這兩個變成檔案放到~/CTFd/conf/nginx
我這裡取名為
原點憑證 -> origin.pem
私密金鑰 -> private.pem
此時ls,應該會有3個檔案

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 { 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;
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; }
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: 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

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

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

參考資料
Cloudflare介紹 : [Day5] SSL/TLS — 30 天入門 Cloudflare
Cloudflare的優勢 : 為什麼要託管到Cloudflare
Cloudflare掛SSL : 使用Cloudflare幫你的網站掛上SSL憑證與CDN
CTFd的nginx.conf範例 : mishrasunny174/nginx.conf
後記
CTFd設置到這應該就結束了!感謝學校提出想要辦校內的CTF小比賽,透過架設平台學到了好多咚咚