簡介
- 現在已經進入
HTTPS
的時代,HTTPS 證照
目前應用廣泛, 發展迅速. 相較於明文傳輸的HTTP
,HTTPS
更加安全. -
HTTPS
即Hypertext Transfer Protocol Secure
, 由於其安全層使用的是TLS/SSL
, 因此HTTPS
也可以稱為HTTP over TLS
或HTTP over SSL
. 關於HTTPS
證照的分類, 可以參考這篇部落格 -
HTTPS 證照
需要向國際公認的證照證照認證機構 Certificate Authority (CA) 申請. - 接下來, 我們將使用自動化證照管理工具 acme.sh 為我們的域名申請 Let`s Encrypt 頒發的
HTTPS
證照, 然後將其部署在我們的網站上. - 本文假設我們的域名為
www.awesome.com
開發環境
-
在前文的基礎上, 我們只需增加 acme.sh 這個工具. 它的中文文件在這裡. 安裝
acme.sh
的過程很簡單, 在Terminal
中輸入如下命令acme.sh
即可.curl https://get.acme.sh | sh
生成證照
-
我們可以使用
http
方式來驗證我們對域名的所有權.-
如果只申請單域名證照 (Single Domain Certificate, 如單域名
www.awesome.com
), 那麼在Terminal
中執行如下命令即可acme.sh --issue -d www.awesome.com --standalone
acme
會在當前目錄生成一個驗證檔案, 然後執行一個監聽 80 埠的 server, 如果Let`s Encrypt
成功地通過域名下載了這個檔案, 就驗證了我們對域名的所有權, 就可以簽發證照了.我們也可以執行一個
file server
監聽80
埠cd ~/webapp python3 -m http.server 80
然後在另一個
Terminal
裡輸入如下命令cd ~ acme.sh --issue -d www.awesome.com --webroot ~/webapp
-
-
我們也可以通過
dns
方式來驗證我們對域名的所有權. 如果要申請萬用字元證照 (Wildcard Certificate, 如*.awesome.com
形式的通用域名), 則需要用dns
方式進行驗證.-
首先我們在
Godaddy
上申請開發者API key & secret
, 然後參考acme.sh
的文件 readme 和 dnsapi, 執行如下命令export GD_Key="xxxxxxxx" export GD_Secret="yyyyy" acme.sh --issue --dns dns_gd -d "*.awesome.com" -d awesome.com
如果一切順利, 我們會發現 Godaddy 的
DNS txt record
中多了一條_acme-challenge
記錄. 接下來acme
會先等待120s
以待新的紀錄生效, 然後通知Let`s Encrypt
驗證我們對域名的所有權, 驗證通過後,Let`s Encrypt
會為我們簽發證照.
-
- 下一節, 我們將講述如何安裝和部署證照
安裝和部署證照
-
對於單域名證照, 根據 acme 的文件, 我們需要執行以下命令, 將證照和公鑰放到
~/ssl/
資料夾中acme.sh --installcert -d www.awesome.com --key-file ~/ssl/server.key --fullchain-file ~/ssl/server.cer
-
對於萬用字元證照, 操作也是類似的, 把域名換成
"*.awesome.com"
就好了acme.sh --installcert -d "*.awesome.com" --key-file ~/ssl/server.key --fullchain-file ~/sslwebsite/server.cer
-
然後, 在之前編寫的 server 中, 我們需要引入證照和公鑰, 從而將明文的訊息用 ssl/tls 包裹起來. 根據 Stack Overflow, 這篇文章下面的 Comments, 以及 werkzeug docs, 我們需要在
app.run()
中加上ssl_context=(`~/ssl/server.cer`, `~/ssl/server.key`)
引數, 再把監聽埠改為443
即可:# class IndexHandler(...): # ... if __name__ == `__main__`: app.add_url_rule(`/`, view_func=IndexHandler.as_view(`index`)) context = (`./server.cer`, `./server.key`) app.run(port=443, host=`0.0.0.0`, debug=True, threaded=True, ssl_context=context)
- 至此, 我們的
HTTPS
證照已經申請和部署完成了. 但是我們的server
目前還存在一個問題, 就是隻能訪問https://www.awesome.com
, 而原來的http://www.awesome.com
已經無法訪問了, 因為我們的server
現在只能監聽443
埠而不能監聽80
埠. 下一篇文章, 我們將解決這個問題, 方法是另外寫一個server
來監聽80
埠, 並通過redirect
將http
服務重定向為https
. 同時, 我們還將學習如何使用HSTS
, 使瀏覽器預設以更安全的https
的方式訪問我們的網站.