更新 Ubuntu Nginx 的 self-signed SSL 憑證 並確保使用 新版 TLS

主要分為兩個步驟:產生新憑證更新 Nginx 設定

由於您使用的是自簽憑證,您需要手動產生新的憑證和私鑰。


步驟一:產生新的 Self-Signed 憑證

您可以使用 OpenSSL 工具來產生新的私鑰 (private key) 和憑證 (certificate)。

  1. 建立新的私鑰和憑證檔案:
    執行以下指令。這個指令會產生一個新的 2048 位元 RSA 私鑰 (nginx.key) 和一個有效期限 365 天的自簽憑證 (nginx.crt),並使用 SHA-256 演算法(這是現代 TLS 的標準):

    sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx.key -out /etc/ssl/certs/nginx.crt
  2. 填寫憑證資訊:
    執行指令後,系統會要求您輸入一些憑證資訊。請注意 Common Name (e.g. server FQDN or YOUR name) 這一項,您應該填寫您的伺服器 域名 (domain name)IP 位址注意: 現代瀏覽器和應用程式現在通常要求自簽憑證也包含 Subject Alternative Name (SAN) 才能避免警告。如果您需要更進階的設定,可以參考 OpenSSL 文件建立一個設定檔來產生包含 SAN 的憑證。不過對於基本測試或內部使用,上面的指令已經足夠。

步驟二:更新 Nginx 設定檔

接下來,您需要修改 Nginx 的設定檔,確保它指向新的憑證檔案並使用最新的 TLS 協定。

  1. 開啟您的 Nginx 站台設定檔:
    通常位於 /etc/nginx/sites-available//etc/nginx/conf.d/ 之下,然後被連結到 sites-enabled/。例如:
    sudo nano /etc/nginx/sites-available/default
  2. 確認憑證路徑:
    server 區塊中,找到或新增以下兩行,並確認路徑指向您剛才建立的新檔案:
    ssl_certificate /etc/ssl/certs/nginx.crt;
    ssl_certificate_key /etc/ssl/private/nginx.key;
  3. 指定 TLS 協定和加密套件:
    為了確保您使用的是新版的 TLS (TLSv1.2 和 TLSv1.3),請檢查您的 server 區塊或主設定檔 (/etc/nginx/nginx.conf) 的 http 區塊中是否包含以下設定:
    # 僅允許 TLSv1.2 和 TLSv1.3,停用舊的、不安全的 SSL/TLS 版本
    ssl_protocols TLSv1.2 TLSv1.3;
    # 優先使用伺服器選擇的加密套件 (更安全)
    ssl_prefer_server_ciphers on;
    # 選擇安全的加密套件清單 (可以根據安全建議調整)
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
    # 啟用 HSTS (推薦,可以強制瀏覽器只使用 HTTPS)
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
  4. 測試 Nginx 設定並重新載入:在應用變更之前,先測試設定檔語法是否正確:
    sudo nginx -t
    如果顯示 test is successful,則重新載入 Nginx 服務以應用新的憑證和設定:
    sudo systemctl reload nginx

後續確認

  • 檢查 Nginx 狀態: 確保服務正常運行:
    sudo systemctl status nginx
  • 測試瀏覽器連線: 使用瀏覽器連線到您的 HTTPS 網址 (https://您的IP或域名)。
    • 由於是 自簽憑證,瀏覽器仍然會跳出安全警告(這是預期的行為,因為憑證不是由被信任的憑證機構簽發的)。
    • 在瀏覽器的憑證資訊中,您可以確認憑證的有效期和使用的 簽名演算法 (應該是 SHA-256) 是否與您剛產生的新憑證一致。
    • 您也可以使用 SSLLabs 或類似的線上工具來檢查您的伺服器支援的 TLS 協定版本加密強度

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *