Web 開發學習筆記(3) — 申
- 2020 年 1 月 3 日
- 筆記
簡介
- 現在已經進入
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 –standaloneacme
會在當前目錄生成一個驗證文件, 然後運行一個監聽 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
- 如果只申請單域名證書 (Single Domain Certificate, 如單域名
- 我們也可以通過
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
的方式訪問我們的網站.
參考鏈接
- https://imququ.com/post/letse…
- https://github.com/Neilpang/a…https://github.com/Neilpang/a… https://github.com/Neilpang/a…
- https://letsencrypt.org/
- https://stackoverflow.com/que…http://flask.pocoo.org/docs/1… http://flask.pocoo.org/snippe… http://werkzeug.pocoo.org/doc… http://werkzeug.pocoo.org/doc…
- https://jjayyyyyyy.github.io/…