Web 開發學習筆記(3) --- 申請和部署HTTPS證書

簡介

  • 如今已經進入 HTTPS 的時代, HTTPS 證書 目前應用普遍, 發展迅速. 相較於明文傳輸的 HTTP, HTTPS 更加安全.


  • HTTPSHypertext Transfer Protocol Secure, 因爲其安全層使用的是 TLS/SSL, 所以 HTTPS 也能夠稱爲 HTTP over TLSHTTP over SSL. 關於 HTTPS 證書的分類, 能夠參考這篇博客


  • HTTPS 證書 須要向國際公認的證書證書認證機構 Certificate Authority (CA) 申請.


  • 接下來, 咱們將使用自動化證書管理工具 acme.sh 爲咱們的域名申請 Let's Encrypt 頒發的 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 的文檔 readmednsapi, 執行以下命令瀏覽器


      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 端口, 並經過 redirecthttp 服務重定向爲 https. 同時, 咱們還將學習如何使用 HSTS, 使瀏覽器默認以更安全的 https 的方式訪問咱們的網站.


參考連接

相關文章
相關標籤/搜索