HTTPS
的時代, HTTPS 證書
目前應用普遍, 發展迅速. 相較於明文傳輸的 HTTP
, HTTPS
更加安全. HTTPS
即 Hypertext Transfer Protocol Secure
, 因爲其安全層使用的是 TLS/SSL
, 所以 HTTPS
也能夠稱爲 HTTP over TLS
或 HTTP over SSL
. 關於 HTTPS
證書的分類, 能夠參考這篇博客HTTPS 證書
須要向國際公認的證書證書認證機構 Certificate Authority (CA) 申請.HTTPS
證書, 而後將其部署在咱們的網站上.www.awesome.com
在前文的基礎上, 咱們只需增長 acme.sh 這個工具. 它的中文文檔在這裏. 安裝 acme.sh
的過程很簡單, 在 Terminal
中輸入以下命令 acme.sh
便可.html
curl https://get.acme.sh | sh
咱們可使用 http
方式來驗證咱們對域名的全部權.python
若是隻申請單域名證書 (Single Domain Certificate, 如單域名 www.awesome.com
), 那麼在 Terminal
中運行以下命令便可git
acme.sh --issue -d www.awesome.com --standalone
acme
會在當前目錄生成一個驗證文件, 而後運行一個監聽 80 端口的 server, 若是 Let's Encrypt
成功地經過域名下載了這個文件, 就驗證了咱們對域名的全部權, 就能夠簽發證書了.github
咱們也能夠運行一個 file server
監聽 80
端口web
cd ~/webapp python3 -m http.server 80
而後在另外一個 Terminal
裏輸入以下命令flask
cd ~ acme.sh --issue -d www.awesome.com --webroot ~/webapp
咱們也能夠經過 dns
方式來驗證咱們對域名的全部權. 若是要申請通配符證書 (Wildcard Certificate, 如 *.awesome.com
形式的通用域名), 則須要用 dns
方式進行驗證.api
首先咱們在 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/
文件夾中bash
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
的方式訪問咱們的網站.