本文是我參考互聯網上一些 HTTPS 相關文章, 而后自己實踐而來
主要內容由 ** 獲取證書 ,nginx TSL 配置 ** 兩部分組成
項目環境搭建
- Git (安裝 Git)
- Nginx (Nginx 安裝配置)
獲取證書
安裝完 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.pem
和chain.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 配置之完整篇 一文而來
另外一些配置的詳情, 作用, 原理也可以在他的博客中進行搜索得知
本文同時也參考了以下博客