1. 程式人生 > 其它 >Web開發必知必會,如何使用 Letsencrypt 為網站簽發 HTTPS 證書提供安全支援

Web開發必知必會,如何使用 Letsencrypt 為網站簽發 HTTPS 證書提供安全支援

技術標籤:全棧開發linuxnginxjavascript

在這裡插入圖片描述

在做 Web 開發中,對網站內容的基本安全加密就是使用 HTTPS,並且在一些重視安全性的軟體中,HTTPS 必不可少,微信開發中配置的域名強制使用 HTTPS,parse-dashboard 的配置連線必須使用 HTTPS,等等。

現在可以很方便的在各雲服務提供商購買證書,唯一的缺點就是需要 付費,那麼有沒有 免費白嫖 的證書呢?

答案是 有的,今天介紹的就是使用比較知名的自簽名證書機構 Letsencrypt 來對自己的網站域名簽發證書了支援 HTTPS。

  1. 登入到伺服器

    使用 ssh 登入到執行的網站的伺服器。

  2. 安裝 snapd

    snapd 是目前各個 Linux 發行版中很好用的包管理工具。

    示例中的安裝是基於 CentOS 7 系統來安裝的,如果你使用的是其他發行版的系統,那麼具體的安裝請參考 snapd 的官網中的安裝文件,傳送門

    • 新增 REPL

      • CentOS 8

        $ sudo dnf install epel-release
        $ sudo dnf upgrade
        
      • CentOS 7

        $ sudo yum install epel-release
        
    • 安裝 snapd

      • 配置了 REPL 之後,輸入下面命令即可安裝 snapd

        $ sudo yum install snapd
        
      • 安裝完成後,systemd

        服務需要執行 enable

        $ sudo systemctl enable --now snapd.socket
        
      • snapd 的檔案目錄連結到系統的路徑中

        snapd 安裝完成之後提供的命令是 snap, 預設安裝在 /snap 的目錄中

        $ sudo ln -s /var/lib/snapd/snap /snap
        
  3. 檢視 snapd 版本

    執行命令安裝 snapd 核心庫,確保安裝的 snapd 版本是最新的。

    sudo snap install core; sudo snap refresh core
    
  4. 移除 certbot-auto 和其他 Certbot 模組包

    使用不同系統自身的包管理工具解除安裝已經安裝的 Certbot 模組,常用的 apt

    yum dnf 等。

    sudo apt-get remove certbot, sudo dnf remove certbot, or sudo yum remove certbot
    
  5. 安裝 Certbot

    Certbot 是生成 HTTPS 證書的主要工具,在之前的版本中 Certbot 使用 Python 來安裝,由於 Python 中安裝包總是出現版本不一致的問題導致安裝不成功,因此官方建議現在使用 snap 來安裝 Certbot。

    sudo snap install --classic certbot
    
  6. 將 certbot 連結到系統環境變數中

    sudo ln -s /snap/bin/certbot /usr/bin/certbot
    
  7. 使用 Nginx 生成 HTTPS 證書

    使用 Nginx 生成證書有兩種方式:

    • 使用 certbot 生成證書並且使用 certbot 更改 Nginx 的配置檔案

      sudo certbot --nginx
      
    • 僅使用 certbot 生成證書

      sudo certbot certonly --nginx
      

    在生成證書的過程中,certbot 會提示你輸入郵箱來進行下一步的驗證,此時你可以在執行命令的時候新增 --register-unsafely-without-email 跳過郵箱驗證步驟:

    sudo certbot --nginx --certonly --register-unsafely-without-email
    

    然後在接下來的步驟中根據要生成證書的域名選擇就可以生成自己的 HTTPS 證書啦

  8. 配置自動更新證書

    由於 Letsencrypt 提供的證書的有效期只有 90 天,所以我們需要對我們的證書及時續簽。

    通過執行 renew 命令來進行證書續簽操作,新增 --dry-run 引數代表模擬續簽,檢視執行命令的結果輸出

    sudo certbot renew --dry-run
    
  9. 使用 crontab 新增定時續簽

    Linux 執行定時任務,離不開使用 crontab 命令,在 crontab 配置中新增以下配置

    0 0,12 * * * sudo certbot renew > /var/log/certbot.renew.log
    

    以上指令碼代表在每天的 24 點和 12 點定時檢查證書是否到期,並執行續簽操作。

  10. 檢視 HTTPS 服務是否正確開啟

    • 在瀏覽器中開啟配置 HTTPS 的域名,檢視是否已經切換成了 HTTPS 的標誌
    • 在命令列中通過 curl 命令檢視 HTTPS 是否開啟

    在命令列中輸入以下命令檢視域名的輸出:

     ```bash
     curl -vIL https://zi.pongj.com
     ```
    

    輸出結果中,可以看到配置的 HTTPS 證書資訊,證書的簽署日期是 Dec 29 07:06:07 2020 GMT,到期日期是 Mar 29 07:06:07 2021 GMT

     ```bash
     * About to connect() to zi.pongj.com port 443 (#0)
     *   Trying 49.235.105.234...
     * Connected to zi.pongj.com (49.235.105.234) port 443 (#0)
     * Initializing NSS with certpath: sql:/etc/pki/nssdb
     *   CAfile: /etc/pki/tls/certs/ca-bundle.crt
       CApath: none
     * SSL connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
     * Server certificate:
     * 	subject: CN=zi.pongj.com
     * 	start date: Dec 29 07:06:07 2020 GMT
     * 	expire date: Mar 29 07:06:07 2021 GMT
     * 	common name: zi.pongj.com
     * 	issuer: CN=R3,O=Let's Encrypt,C=US
     > HEAD / HTTP/1.1
     > User-Agent: curl/7.29.0
     > Host: zi.pongj.com
     > Accept: */*
     >
     < HTTP/1.1 200 OK
     HTTP/1.1 200 OK
     < Server: nginx/1.18.0
     Server: nginx/1.18.0
     < Date: Fri, 22 Jan 2021 05:40:37 GMT
     Date: Fri, 22 Jan 2021 05:40:37 GMT
     < Content-Type: text/html; charset=utf-8
     Content-Type: text/html; charset=utf-8
     < Content-Length: 219958
     Content-Length: 219958
     < Connection: keep-alive
     Connection: keep-alive
     < ETag: "35b36-TbUTbYgQ6yT1OJeOQSyX0F3IN9g"
     ETag: "35b36-TbUTbYgQ6yT1OJeOQSyX0F3IN9g"
     < Accept-Ranges: none
     Accept-Ranges: none
     < Vary: Accept-Encoding
     Vary: Accept-Encoding
     
     <
     * Connection #0 to host zi.pongj.com left intact
     ```
    

更多內容

前端開發轉全棧,目前的技術棧是 Node.js、Python,日常研究 C 和 Rust,孜孜啃食系統開發和網路設計中~

更多的內容請移步[email protected],知乎@孟太白,掘金,或者關注我的公眾號@全棧開發師,歡迎來撩~

學到老,寫到老,生命不停,程式設計不止~

加油,打工人~