Nginx 配置 Let's Encrypt TLS 證書

本文是我參考互聯網上一些 HTTPS 相關文章, 而后自己實踐而來
主要內容由 ** 獲取證書 ,nginx TSL 配置 ** 兩部分組成

項目環境搭建

獲取證書

安裝完 Git 后, 克隆 certbot(* 原名 letsencrypt*) 項目

$ git clone https://github.com/certbot/certbot
$ cd certbot

克隆完成后, 此時可以通過命令獲取證書

  • Webroot
    該方式適用于本機中正在運行中的項目, 無須停止服務器即可申請
$ ./certbot-auto certonly --webroot -w /usr/local/nginx/html --email admin@example.com -d example.com -d www.example.com -d other.example.com

--webroot 為申請方式類型
-w /usr/local/nginx/html 配置申請域名項目的 Webroot 跟路徑, 以靜態頁面為例

location / {
    root   /usr/local/nginx/html;
    index  index.html;
}

該方式會在 /usr/local/nginx/html 目錄下創建一個 .well-known/acme-challenge 文件夾, 然后生成一個隨機文件進行訪問. 如
http://example.com/.well-known/acme-challenge/HGr8U1IeTW4kY_Z6UIyaakzOkyQgPr_7ArlLgtZE8SX
如果項目進行了反向代理, 請確保 -w 參數后面路徑為 代理項目所在的根目錄
--email admin@example.com 為申請者的 ** 郵箱 **, 在證書快過期時, 會發送通知郵件
-d example.com 為要 ** 申請的域名 **, 允許存在多個, 格式為 -d 域名 -d 域名, ** 但要求域名訪問地址為本機 **

  • Standalone
    該方式需要 ** 確保 80,443 端口沒有被占用 **
$ ./certbot-auto certonly --standalone --email admin@example.com -d example.com -d www.example.com -d other.example.com

--standalone 為申請方式類型
--email admin@example.com -d example.com 參數參考 Webroot 方式
如果驗證沒有問題, 稍候頁面會彈出一個協議對話框, 點擊 Agree 即可

  • Manual
    該方式適用于申請證書服務器不是域名所在服務器的情況
$ ./certbot-auto certonly --manual --email admin@example.com -d example.com -d www.example.com -d other.example.com

--standalone 為申請方式類型
--email admin@example.com 參數參考 Webroot 方式
-d example.com 為需要申請的域名,需要擁有對該域名所在機器的讀寫權限
運行后, 會要求用戶在域名所在服務器的項目跟目錄創建一個文件, 并指定文件內容

Make sure your web server displays the following content at
http://example.com/.well-known/acme-challenge/VE_oSzihad5ZNYPnE_OLT2aQ-BdT_M3z5ITj53wQ-Oc before continuing:
VE_oSzihad5ZNYPnE_OLT2aQ-BdT_M3z5ITj53wQ-Oc.JhmxNt13DUzzmC4_7VfnfWh1gmePbExxQygAMf9KTSo
# 省略
# /tmp/certbot/public_html 應為域名所在服務器的項目跟路徑
mkdir -p /tmp/certbot/public_html/.well-known/acme-challenge
# 進入項目跟路徑
cd /tmp/certbot/public_html
# 指定內容輸入到指定文件中
printf "%s" VE_oSzihad5ZNYPnE_OLT2aQ-BdT_M3z5ITj53wQ-Oc.JhmxNt13DUzzmC4_7VfnfWh1gmePbExxQygAMf9KTSo > .well-known/acme-challenge/VE_oSzihad5ZNYPnE_OLT2aQ-BdT_M3z5ITj53wQ-Oc
# 省略
Press Enter to Continue

操作完成后按下回車鍵即可

申請操作成功后, 會在界面中輸出證書的存放路徑, 以及證書的到期時間 (**90 天 **)

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/example.com/fullchain.pem. Your cert
   will expire on 2017-08-17. To obtain a new or tweaked version of
   this certificate in the future, simply run certbot-auto again. To
   non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

生成證書中會創建 /etc/letsencrypt 文件夾, 證書文件默認存放在 /etc/letsencrypt/live/example.com 文件夾中, 其中 example.com 取自第一個域名
example.com 文件夾中包含 4 個文件 cert.pem chain.pem fullchain.pem privkey.pem

  • cert.pem 域名證書
  • chain.pem 根證書及中間證書
  • fullchain.pem 由 cert.pemchain.pem 合并而成
  • privkey.pem 證書私鑰

** 創建一個 2048 位的 Diffie-Hellman 文件 **(nginx 默認使用 1024 位的 Diffie–Hellman 進行密鑰交換, 安全性太低)

openssl dhparam -out /etc/letsencrypt/live/dhparams.pem 2048

nginx TSL 配置

首先對 http 協議進行 301 重定向到 https 協議

server {
  listen 80;
  server_name example.com www.example.com;
  return 301 https://example.com$request_uri;
}

https 相關配置

server {
    listen 443 ssl;
    server_name example.com www.example.com;
    
    # 配置站點證書文件地址
    ssl_certificate      /etc/letsencrypt/live/example.com/fullchain.pem;
    # 配置證書私鑰
    ssl_certificate_key  /etc/letsencrypt/live/example.com/privkey.pem;
    
    # 配置 Diffie-Hellman 交換算法文件地址
    ssl_dhparam          /etc/letsencrypt/live/dhparams.pem;
    
    # 配置服務器可使用的加密算法
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';

    # 指定服務器密碼算法在優先于客戶端密碼算法時,使用 SSLv3 和 TLS 協議
    ssl_prefer_server_ciphers  on;
    
    # ssl 版本 可用 SSLv2,SSLv3,TLSv1,TLSv1.1,TLSv1.2 
    # ie6 只支持 SSLv2,SSLv3 但是存在安全問題, 故不支持
    ssl_protocols        TLSv1 TLSv1.1 TLSv1.2;
    
    # 配置 TLS 握手后生成的 session 緩存空間大小 1m 大約能存儲 4000 個 session
    ssl_session_cache          shared:SSL:50m;
    # session 超時時間
    ssl_session_timeout        1d;
    
    # 負載均衡時使用 此處暫時關閉 詳情見 https://imququ.com/post/optimize-tls-handshake.html 
    # 1.5.9 及以上支持
    ssl_session_tickets off;
    
    # 瀏覽器可能會在建立 TLS 連接時在線驗證證書有效性,從而阻塞 TLS 握手,拖慢整體速度。OCSP stapling 是一種優化措施,服務端通過它可以在證書鏈中封裝證書頒發機構的 OCSP(Online Certificate Status Protocol)響應,從而讓瀏覽器跳過在線查詢。服務端獲取 OCSP 一方面更快(因為服務端一般有更好的網絡環境),另一方面可以更好地緩存 以上內容來自 https://imququ.com/post/my-nginx-conf-for-wpo.html
    # 1.3.7 及以上支持
    ssl_stapling               on;
    ssl_stapling_verify        on;
    # 根證書 + 中間證書
    ssl_trusted_certificate    /etc/letsencrypt/live/example.com/fullchain.pem;
    
    # HSTS 可以告訴瀏覽器,在指定的 max-age 內,始終通過 HTTPS 訪問該域名。即使用戶自己輸入 HTTP 的地址,或者點擊了 HTTP 鏈接,瀏覽器也會在本地替換為 HTTPS 再發送請求 相關配置見 https://imququ.com/post/sth-about-switch-to-https.html
    add_header Strict-Transport-Security max-age=60;
    
    # 在次填寫原本 http 協議中的配置
}

以上配置完成后, 重啟 nginx 即可完成對 https 的切換

使用以下命令即可進行 ** 續期 **, 續期成功后需要服務器

$ ./certbot-auto renew

該命令只會對快到期的證書才會進行更新, 如果希望強制更新, 可以增加 --force-renewal 參數

通過 Qualys SSL labs 提供的 SSL Server Test 服務可以查看網站的當前配置, 以及測試網站安全評分
另外該網站緩存了一些知名網站的測試結果, 點擊以下鏈接可進行查看

其他說明

如果一個 IP 需要配置多張證書, 請查看 關于啟用 HTTPS 的一些經驗分享(二) **SNI 擴展 ** 部分
文中 ssl_ciphers 配置參考 Mozilla SSL Configuration Generator 中的常規配置而來
Mozilla 同時也提供 TSL 配置說明文檔 Security/Server Side TLS
另外也可參考 cipherli 提供的 TSL 配置模版
除了 ssl_ciphers 配置外, 其他皆是參考 Jerry Qu本博客 Nginx 配置之完整篇 一文而來
另外一些配置的詳情, 作用, 原理也可以在他的博客中進行搜索得知
本文同時也參考了以下博客

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容