1. 程式人生 > >Nginx-加密會話

Nginx-加密會話

perm -s .html 狀態 ring ret pts can 首部

Nginx實現ssl會話加密:

ssl on | off;  
為指定虛擬機啟用HTTPS protocol, 建議用listen指令代替 

ssl_certificate file;  
當前虛擬主機使用PEM格式的證書文件

ssl_certificate_key file;  
當前虛擬主機上與其證書匹配的私鑰文件

ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]; 
支持ssl協議版本,默 認為後三個

ssl_session_timeout time;  
客戶端連接可以復用ssl session cache中緩存的ssl參數的有效時長,默認5m

ssl_session_cache off | none | [builtin[:size]] [shared:name:size];   
none:  通知客戶端支持ssl session cache,但實際不支持  
builtin[:size]:使用OpenSSL內建緩存,為每worker進程私有  
[shared:name:size]:在各worker之間使用一個共享的緩存

   server {
        listen       443 ssl  default_server;
        listen       [::]:443 ssl http2 default_server;
        server_name  app.a.com;
        root         /www/app/html;

        ssl_certificate "/etc/nginx/conf.d/nginx.crt";
        ssl_certificate_key "/etc/nginx/conf.d/nginx.key";
#       ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_session_cache shared:sslcache:20m;
#       ssl_ciphers HIGH:!aNULL:!MD5;
#       ssl_prefer_server_ciphers on;

#        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
#
        location / {
          }
}
}

支持同一主機多虛擬主機實現ssl會話

快速申請測試證書:
在/etc/pki/tls/certs/目錄下執行:
make [*].crt即可
需要更改一下Makefile文件
 /usr/bin/openssl genrsa  $(KEYLEN) > $@
#/usr/bin/openssl genrsa [-aes128】 $(KEYLEN) > $@
去掉[]中的內容,否則會加密!

Nginx地址重寫功能:

7 地址重寫-rewrite[server|location]

rewrite [表達式] [替換路徑] [標誌位]

location / {
    root /www/b.org;
    rewrite ^/images/(.*)$ /imgs/$1;
}
這樣用戶再查找http://www.b.org/images/a.jpg就會跳轉至
http://www.b.org/imgs/a.jpg--這個網站一樣會被location規則檢查

標誌位:
last:一旦被rewrite規則匹配並重寫後,立刻停止檢查後續的
rewrite規則,而後通過重寫後的規則重新發起請求[響應碼200]

break:一旦被rewrite規則匹配並重寫後,立刻停止檢查後續的
rewrite規則,而後繼續由nginx進行後續的操作

redirect:臨時重定向
重寫完成後以臨時重定向方式直接返回重寫後生成的新URI給客戶端
由客戶端重新發起請求
使用相對路徑,或者http://或https:// 開頭
狀態碼返回302臨時重定向[訪問路徑會改變|會發起兩次請求]

permanent:重寫完成後以永久重定向方式直接返回重寫後生成的新URI給客戶端
由客戶端重新發起請求
狀態碼:301

具體應用1:整網站重定向
server {
    server_name www.c.com;
    listen 80;
    index index.html;
    root /web/c.com;
    error_page 404 =302 /404.html;
    location /test2/ {
        try_files $uri /test2/test.html;
    }

    location / { 
        rewrite / http://www.a.com/break;
    }

}
測試訪問:
[root@apache113:21:20network-scripts]#curl -L http://www.c.com
<h1>test a.com page for nginx virt</h1>
已經跳轉至www.a.com網站!

具體應用2:http--->https在不同虛擬機之上
location / { 
    rewrite / https://app.a.com/;
}

測試訪問:
[root@apache113:28:41network-scripts]#curl -Lk  http://www.c.com
<h1>test nginx ssl session page</h1>

具體應用3:http--->https在同一虛擬主機
如果此時在按照之前的設置進行配置就會出現死循環
因為無論是http還是https都是一個"/"

報錯格式:
[root@apache113:30:50network-scripts]#curl -Lk  http://app.a.com
curl: (47) Maximum (50) redirects followed

此時我們就需要用到另外一個關鍵語法:
if(判斷條件) {

}

使用"="和"!="來比較變量與字符串的關系。
使用"~"(對於區分大小寫匹配)和"~*"(不區分大小寫匹配)的操作符來匹配變量的正則表達式。
正則表達式可以包含可用於以後重用的$ 1…$ 9變量的捕獲。
"!~"和"!"!~*"也可用。
如果正則表達式包含"}"或""字符,則整個表達式應該用單引號或雙引號括起來。
用"-f"和"!-f"檢查文件的存在性!
用"-d"和"!-f"檢查目錄的存在性!
用"-e"和"!-e"檢查文件、目錄或符號鏈接的存在!
用"-x"和"!-x"檢查可執行文件

Nginx內置變量:$scheme[獲取http|https]

正確設置方式:
location / {
    if ( $scheme =  http ) {        
        rewrite / https://app.a.com;
    }

}

解析:如果請求協議時http就轉發!

測試結果:
[root@apache113:30:54network-scripts]#curl -Lk  http://app.a.com
<h1>test nginx ssl session page</h1>

return code:
用於結束rewrite規則,並且為客戶端返回狀態碼
可以使用的狀態碼有 204 400 402-406 500-504等
具體使用:返回提示語句
location /admin {
    return 403 "You can‘t GET this region";
}

訪問測試:
[root@apache113:44:30network-scripts]#curl -I http://www.c.com/admin
HTTP/1.1 403 Forbidden

具體使用2:直接跳轉其它頁面
location /admin {
    return http://app.a.com;
}  

測試結果:
[root@apache113:46:59network-scripts]#curl -Lk http://www.c.com/admin
<h1>test nginx ssl session page</h1>

rewrite_log on|off
是否把重寫過程記錄再錯誤日誌中,默認級別為notice級別
默認是off,再繁忙的服務器中不建議打開

設置:
server {
    server_name www.c.com;
    listen 80;
    index index.html;
    root /web/c.com;
    error_log /web/c.com/c.com.erro.log;
    rewrite_log on;
    error_page 404 =302 /404.html;
    location /test2/ {
        try_files $uri /test2/test.html;
    }

    location /admin {
        return http://app.a.com;
    } 
    location /down {
        rewrite /down http://www.c.com/test2;
    } 

}

僅對rewrite語句有效|對return語句不起作用!

set $variable value;  
用戶自定義變量  
註意:變量定義和調用都要以$開

Nginx防盜鏈:

很多情況下,如果我們沒有對我們網站的資源做足夠多
的保護,就很可能被別的網站進行盜鏈活動,這樣會很占
據我們自己的網絡帶寬!
例如:
我們自己的網站:www.c.com
競爭產品網站:www.a.com
a網站index.html主頁代碼:
[root@www19:20:50a.com]#cat index.html 
<h1>test a.com page for nginx virt</h1>
<img src="http://www.c.com/linux.jpg">
這樣訪問的時候,會在a網站的頁面上出現我們的圖片!
這時候就需要我們運維人員進行設置,防止對方盜鏈:
方法:valid_referers[server|location]

1 定義合規的引用
valid_referers none | blocked | server_names | string ...;
解析:
none:referer為空,瀏覽器直接訪問referer值為空,
應該允許訪問
blocked:請求首部中有referer字段,但是referer字段被
清空,通常情況下應該允許訪問
server_names:主機名
regular expression:被指定的正則表達式模式匹配到的字符串,要使用~開頭
arbitrary_string:任意字符串,但可使用*作通配符

2 拒絕不合規的引用
if($invalid_referer) {
     rewrite;
}

具體應用:
c網站運維人員設置:
location ~* .*\.(jpg|gif)$ {
    valid_referers none blocked www.c.com *.c.com;
    if ($invalid_referer) {
        rewrite ^/ http://www.c.com/test2/index.html;
    }
}   

這樣再次訪問a網站的時候就不會被盜鏈了!

Nginx-加密會話