【nginx運維基礎(7)】配置SSL支持https訪問

關於 SSL 證書

有關 SSL 的介紹能夠參閱阮一峯老師的《SSL/TLS協議運行機制的概述》html

SSL 證書主要有兩個功能:加密身份證實,一般須要購買,也有免費的,本文使用阿里雲的一年免費期的ssl證書。nginx

申請免費證書

阿里雲控制檯-產品與服務-安全(雲盾)-SSL證書,點擊購買證書,選擇免費型DV SSL->補全申請簽發證書,而後下載證書。算法

配置證書

  1. 進入nginx配置目錄,增長certs/文件夾,把剛剛下載的兩個文件上傳到certs/文件夾中。
  2. 對443端口和80端口進行監聽,443端口要啓用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
}

HTTPS服務器優化

減小 CPU 運算量

SSL 的運行計算須要消耗額外的 CPU 資源,通常多核處理器系統會運行多個工做進程(worker processes),進程的數量不會少於可用的 CPU 核數。SSL 通信過程當中『握手』階段的運算最佔用 CPU 資源,有兩個方法能夠減小每臺客戶端的運算量:瀏覽器

  • 激活keepalive長鏈接,一個鏈接發送更多個請求
  • 複用 SSL 會話參數,在並行併發的鏈接數中避免進行屢次 SSL『握手』

這些會話會存儲在一個 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 策略強制瀏覽器使用 HTTPS 鏈接

HSTS – HTTP Strict Transport Security,HTTP嚴格傳輸安全。它容許一個 HTTPS 網站要求瀏覽器老是經過 HTTPS 來訪問,這使得攻擊者在用戶與服務器通信過程當中攔截、篡改信息以及冒充身份變得更爲困難。服務器

只要在 Nginx 配置文件加上如下頭信息就能夠了:session

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;preload" always;
  • max-age:設置單位時間內強制使用 HTTPS 鏈接
  • includeSubDomains:可選,全部子域同時生效
  • preload:可選,非規範值,用於定義使用『HSTS 預加載列表』
  • always:可選,保證全部響應都發送此響應頭,包括各類內置錯誤響應

當用戶進行 HTTPS 鏈接的時候,服務器會發送一個Strict-Transport-Security響應頭:併發

圖片描述

瀏覽器在獲取該響應頭後,在max-age的時間內,若是遇到 HTTP 鏈接,就會經過 307 跳轉強制使用 HTTPS 進行鏈接,並忽略其它的跳轉設置(如 301 重定向跳轉):優化

圖片描述

307 跳轉Non-Authoritative-Reason響應頭

圖片描述

增強 HTTPS 安全性

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;
        #...
相關文章
相關標籤/搜索