有關 SSL 的介紹能夠參閱阮一峯老師的《SSL/TLS協議運行機制的概述》。html
SSL 證書主要有兩個功能:加密和身份證實,一般須要購買,也有免費的,本文使用阿里雲的一年免費期的ssl證書。nginx
阿里雲控制檯-產品與服務-安全(雲盾)-SSL證書,點擊購買證書,選擇免費型DV SSL->補全申請簽發證書,而後下載證書。算法
server { listen 443; server_name bjubi.com; // 你的域名 ssl on; root /var/www/bjubi.com; // 前臺文件存放文件夾,可改爲別的 index index.html index.htm;// 上面配置的文件夾裏面的index.html ssl_certificate /etc/nginx/conf.d/certs/site2/www.site1.com.crt; ssl_certificate_key /etc/nginx/conf.d/certs/site2/www.site1.com.key; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location / { index index.html index.htm; } } server { listen 80; server_name www.site1.com;// 你的域名 rewrite ^(.*)$ https://$host$1 permanent;// 把http的域名請求轉成https }
SSL 的運行計算須要消耗額外的 CPU 資源,通常多核處理器系統會運行多個工做進程(worker processes),進程的數量不會少於可用的 CPU 核數。SSL 通信過程當中『握手』階段的運算最佔用 CPU 資源,有兩個方法能夠減小每臺客戶端的運算量:瀏覽器
這些會話會存儲在一個 SSL 會話緩存裏面,經過命令ssl_session_cache配置,可使緩存在機器間共享,而後利用客戶端在『握手』階段使用的seesion id
去查詢服務端的 session cathe(若是服務端設置有的話),簡化『握手』階段。緩存
1M 的會話緩存大概包含 4000 個會話,默認的緩存超時時間爲 5 分鐘,能夠經過使用ssl_session_timeout命令設置緩存超時時間。下面是一個擁有 10M 共享會話緩存的多核系統優化配置例子:安全
http { #配置共享會話緩存大小 ssl_session_cache shared:SSL:10m; #配置會話超時時間 ssl_session_timeout 10m; server { #... #設置長鏈接 keepalive_timeout 70; #...
HSTS – HTTP Strict Transport Security,HTTP嚴格傳輸安全。它容許一個 HTTPS 網站要求瀏覽器老是經過 HTTPS 來訪問,這使得攻擊者在用戶與服務器通信過程當中攔截、篡改信息以及冒充身份變得更爲困難。服務器
只要在 Nginx 配置文件加上如下頭信息就能夠了:session
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;preload" always;
當用戶進行 HTTPS 鏈接的時候,服務器會發送一個Strict-Transport-Security響應頭:併發
瀏覽器在獲取該響應頭後,在max-age
的時間內,若是遇到 HTTP 鏈接,就會經過 307 跳轉強制使用 HTTPS 進行鏈接,並忽略其它的跳轉設置(如 301 重定向跳轉):優化
307 跳轉Non-Authoritative-Reason響應頭
HTTPS 基礎配置採起的默認加密算法是 SHA-1,這個算法很是脆弱,安全性在逐年下降,在 2014 年的時候,Google 官方博客就宣佈在 Chrome 瀏覽器中逐漸下降 SHA-1 證書的安全指示,會從 2015 年起使用 SHA-2 簽名的證書,可參閱Rabbit_Run在 2014 年發表的文章:《爲何Google急着殺死加密算法SHA-1》
爲此,主流的 HTTPS 配置方案應該避免 SHA-1,可使用迪菲-赫爾曼密鑰交換(D-H,Diffie–Hellman key exchange)方案。
首先在目錄/etc/ssl/certs
運行如下代碼生成dhparam.pem
文件:
openssl dhparam -out dhparam.pem 2048
而後加入 Nginx 配置:
#優先採起服務器算法 ssl_prefer_server_ciphers on; #使用DH文件 ssl_dhparam /etc/ssl/certs/dhparam.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #定義算法 ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4"; #減小點擊劫持 add_header X-Frame-Options DENY; #禁止服務器自動解析資源類型 add_header X-Content-Type-Options nosniff; #防XSS攻擊 add_header X-Xss-Protection 1;
優化後的綜合配置
worker_processes auto; http { #配置共享會話緩存大小,視站點訪問狀況設定 ssl_session_cache shared:SSL:10m; #配置會話超時時間 ssl_session_timeout 10m; server { listen 443 ssl; server_name www.example.com; #設置長鏈接 keepalive_timeout 70; #HSTS策略 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; #證書文件 ssl_certificate www.example.com.crt; #私鑰文件 ssl_certificate_key www.example.com.key; #優先採起服務器算法 ssl_prefer_server_ciphers on; #使用DH文件 ssl_dhparam /etc/ssl/certs/dhparam.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #定義算法 ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4"; #減小點擊劫持 add_header X-Frame-Options DENY; #禁止服務器自動解析資源類型 add_header X-Content-Type-Options nosniff; #防XSS攻擊 add_header X-Xss-Protection 1; #...