這篇文章寫到最後才發現 Cloudflare 自己就已經提供免費的 SSL 可以使用,如果你已經有在用 (真的蠻好用的,重點是永久免費),所以可以先直接往下滑找到 設定 Cloudflare 的 SSL 模式
區塊看看
之前有用過 StarSSL 來作為 SSL for https 的 CA,原因當然是因為不用錢 (好像是永久免費,每年 renew 一次即可),但是使用後發現他的免費憑證 (Class 1) 在手機上還是會顯示出無法驗證憑證的訊息,所以就放棄使用 https 了
之前 Github 推出 Student Developer Pack 提供給窮學生們免費使用各種付費服務,其中有 VPS by Digital Ocean, Domain name by namecheap and SSL by namecheap,最近正好想到 中興大學學生會 ILT 會員系統 理論上必須要架設在 https 環境下使用,今天就是要來使用 PositiveSSL by namecheap 把原本沒有 SSL 的 ILT 系統加上 SSL 使之更安全
這個簡單的教學只是把我申請、設定的過程記錄下來而已,在開始前已經
- 申請好你的 domain ,本教學將使用
nchusg.org
為 domain 名稱 - 在 VPS 上頭架設好 unix 環境,本教學使用
CentOS 6.5
- 安裝好 nginx,並且原本就已經設定好 Virtual hosts 了
- 使用 cloudflare 作為 subdomain 管理 (for virtual hosts)以及 CDN
- 並且已經設定好
ilt.nchusg.org
這個 subdomain
- 並且已經設定好
如果你的環境已經準備好,那就開始吧
首先到 Student Developer Pack 中找到 Namecheap
的 One year SSL certificate
那裏,複製 Your code
然後點選連結,把剛剛複製的輸入到右邊的 Promo Code
裡頭,Apply
之後應該可以發現 PositiveSSL
的一年方案是免錢的,按下 Confirm Order
啊如果之前沒使用過 namecheap 的服務,現在應該是要來申請一個帳號
這樣一來你這隻帳號應該就有一個 PositiveSSL 服務可用了
我當時也只是照著 官方教學 做的,只是要先製作好你的 CA request Code 來申請一個驗證過合法的 CA (crt),SSL 會要用申請的就是因為這個 CA,讓拜訪者用 CA 驗證你的伺服器使用的公鑰真的是你的而非盜用來的,SSL Wiki
我們使用 CentOS 6
,並且 Web server 是 nginx
,所以照著 這個官方教學走即可
簡單來說就是直接下
# openssl req -new -newkey rsa:2048 -nodes -keyout private.key -out request.csr
接著 openssl
會問你一串問題, 注意 這些問題都是申請 CA 必要的資料 (只有後面的 Optional 可以免),這邊列出他會問的問題
- Country Name:
TW
forTaiwan
- State or Province Name:
Taichung
(台中) - Locality Name:
Taichung
(台中) - Organization Name:
National Chung Hsing University Student Government
(中興大學學生會) - Organizational Unit Name:
Information Technology department
(資訊部) - Common Name:
ilt.nchusg.org
其實就是這隻 CA 要給用的 domain name (悲劇 PositiveSSL 不給用*.nchusg.org
,能這樣做的 CA 神貴) - Email Address: 你的 Email
接著你會得到 private.key
和 request.csr
這兩個檔案,你的 CSR Code 就是 request.csr
的檔案內容 (公鑰在裡頭),private.key
保管好就好
- 登入 namecheap
hover
你的滑鼠到左上的帳號名稱上,點選Manage SSL Certificates
Your SSL Certificates
列表中應該有個 HOST NAME 是Not provided yet
並且 SSL TYPE 是POSITIVE SSL
,那就是你剛申請好的,點Activate Now
- server type 選擇
nginx
,接著把剛剛生出來的request.csr
檔案內容貼上 - 送出後要選擇驗證用 Email 的地址,這邊通常要選擇當時申請
domain
時使用的 Email (WHOIS 提供的那個),他列出的 Email 我們不能用,因為我們並沒有自己架設 mail server,一般來說有 domain 的公司行號會自己架設 mail server ... 吧 - 接著輸入有
*
的欄位,並確保E-Mail Address to send the certificate
這個信箱你收得到 - 接著到步驟 5 選擇的 Email 收信,注意到
To permit
的部分,把裡面提供的驗證碼輸入到那個連結裡頭,不要點選啥Reject
,當時看到還以為輸入的資料被拒絕 = = - 接著再去步驟六時輸入的 Email 收取製作完成的 CA,有一封信有個 zip 附加檔案,裡頭有四個檔案,這個就是你的有效 CA 啦,他對應上面的
private.key
嘿
我們使用 nginx,要把上個步驟中取得的有效 CA 並成一個 crt 檔案 (可能用 OpenSSL 的都是如此):
scp
或者Filezilla
把那個 CA zip 檔案傳送到你的 web server 機器內ssh
進入你的 server 並且unzip
此 CA zip 檔案- 把四個檔案並起來:
# cat ilt_nchusg_org.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt >> ilt_nchusg_org.crt
- 把
private.key
和上個步驟生的ilt_nchusg_org.crt
放置到安全的地方 - 編輯你的 nginx 設定:
# vim /etc/nginx/conf.d/ilt.conf # 這是我們 ilt.nchusg.org virtual host 的設定檔位置
你可以參考 nginx 給你的 SSL 範例: /etc/nginx/example_ssl.conf
,基本上如下:
先把 listen
的值改成 443 ssl
並且加上以下這幾行到 server block 裡頭
ssl_certificate /path/to/ilt_nchusg_org.crt; # 記得改成你的 .crt 檔案位置
ssl_certificate_key /path/to/private.key; # 記得改成你的 private.key 位置
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
如此一來, service nginx restart
應該就 OK 了,不過別急著下這個指令,先 nginx -t
測試一下設定檔案是不是有誤
登入 Cloudflare 後,在 My websites
頁面選擇 齒輪
> CloudFlare settings
,有個 SSL
區塊
上網爬了一下文,發現 Cloudflare 本身就可以拿來用 SSL (Flexible SSL 模式)!!
上網爬了一下文,發現 Cloudflare 本身就可以拿來用 SSL (Flexible SSL 模式)!!
上網爬了一下文,發現 Cloudflare 本身就可以拿來用 SSL (Flexible SSL 模式)!!
OMG,所以我只好研究一下他的幾種模式
- Off: 就是沒有 SSL,我一直以為他就是類似這個模式,純粹 CDN 和 subdomain 的功能 = =
- Flexible SSL: 一般沒改過應該就是這個模式,這個模式下,你就已經可以讓使用者用 https 觀看你的網頁了
- 我測試了一下,一般 http 的網站可以直接改用 https (修改網址就行),就算你的伺服器沒有啟動 https,所以僅有使用者到 cloudflare server 這段有加密
- 雖然使用時使用者看到的是合格 SSL CA 加密,但是 cloudflare server 到你的伺服器之間沒有加密,也就是說...如果駭客能攔截這段封包的話就能見到原始傳輸內容
- 所以這背後其實就是 Cloudflare 會強制把 https 換成 http 送到你的 server,也因此你自己架設的 https 似乎就沒用了(這個還不清楚)
- http => cdn => http => your server / https => cdn => http => your server
- 所以你可以透過修改 cloudflare 的 page rule 來進行 http => https 的強制轉址
- Full SSL
- 我最後使用這個模式,他讓每段傳輸都進行加密,並且在這個模式下,原本伺服器若沒有 https 則 Cloudflare 也不會提供 SSL 的選項
- 所以如果原本 http 進來就會用 http 送進你的 server,https 進來就會 https 傳送到你的 server
- 最猛的就是你的 CA 就算不合格也沒關係,反正 Cloudflare 會用他自己的合格 CA 和使用者連線,Cloudflare 不會對你的 CA 進行檢查
- 如果駭客可以讓 Cloudflare 的 Server 跟你伺服器的連線都變成跟駭客伺服器的連線,資料才會被駭取...應該不容易吧XDD
- Full SSL (Strict)
- 如果你有一個合格的 CA,就可以用這個終極安全的模式,這個模式下 Cloudflare 會檢查你的 CA,不正確時會直接變成 502 錯誤
- 使用這個模式的話,你可以保有最高的安全性,同時配合著 CDN 加速網頁讀取,並且把伺服器的 IP 藏起來
我最後讓
nchusg.org
全部的網站使用 Full SSL ,配合不合格的 SSL CA (自己簽的,教學在此) 包起來,讓 https 進來的全部直接轉成 http 後做 reverse-proxyilt.nchusg.org
個別使用 Full SSL (Strict) 模式,配合一個合格的 SSL CA (PositiveSSL,剛好也只能用於一個 domain),這樣確保連線是 100% 安全的,同時 CDN 功能也保留著
做完上面修該之後,你的網站可能原本用 80 (http) 進來的在你更改設定之後就變成 404 (或者是被導引到其他 virtual host 設定檔) 了,而且 ilt.nchusg.org
這個高安全性需求的網站理論上應該要強制使用 https,上網查了一下發現可以簡單的加上幾行來讓 80 進來的使用者重新導向至 https,一樣先進行 nginx 的設定
# vim /etc/nginx/conf.d/ilt.conf # 這是我們 ilt.nchusg.org virtual host 的設定檔位置
在設定檔最上方加上這幾行:
server {
listen 80;
server_name ilt.nchusg.org; # 記得改的跟原本的 server_name 相同
return 301 https://$server_name$request_uri;
}
存檔之後, service nginx restart
就完成囉 (最好還是先 nginx -t
一下)
Hi, 不知你有沒有測過 Full SSL (Strict) 對 Page loading 的影響,例如 Flexible SSL 與 Full SSL 的比較,兩段和一段的 SSL 驗證在理論上應該多少會有差別。
另外一點是針對頁面的載入速度, Nginx 還能開啟 SPDY 和 設定 ssl_stapling 來增加效能 。