nginx 學習筆記(四)nginx + lua 使用 ssl 驗證 瀏覽器證書

場景:接着筆記(三)的鑑權,須要先調用第三方服務進行鑑權,第三方對應的瀏覽器須要導入證書,不然就會報400錯誤,只有當鑑權成功後才能往下進行反向代理,此處就不強調如何生成證書,如何生成證書能夠自行百度,此文關注點在如何配置ssl,以及配置驗證瀏覽器的證書後如何獲取瀏覽器證書的信息。html

筆記(一)中介紹的是nginx源碼安裝,此處介紹個Openresty安裝。nginx

Centos7安裝Openresty經過yum安裝算法

/etc/yum.repos.d/ 下新建 OpenResty.repo 內容後端

[openresty]
name=Official OpenResty Repository
baseurl=https://copr-be.cloud.fedoraproject.org/results/openresty/openresty/epel-$releasever-$basearch/
skip_if_unavailable=True
gpgcheck=1
gpgkey=https://copr-be.cloud.fedoraproject.org/results/openresty/openresty/pubkey.gpg
enabled=1
enabled_metadata=1

yum install openresty -y
默認會安裝到 /usr/local/openresty/ 目錄下, 目錄下包含了 luajit, lualib, nginx, openssl, pcre, zlib 這些組件。瀏覽器

到此就安裝好了,簡單吧,比源碼安裝簡單多了。緩存

一、nginx 配置服務器

# HTTPS server
    #
    server {
        listen       443 ssl;
        server_name  proxy.ztns.com;
		
		ssl on;
        # 證書公鑰 它會被髮送到鏈接服務器的每一個客戶端
        ssl_certificate /usr/local/openresty/nginx/conf/ssl/proxy.server.crt;
        # 私鑰是用來解密的
        ssl_certificate_key /usr/local/openresty/nginx/conf/ssl/proxy.server.key;
        # CA簽發機構證書
        ssl_client_certificate /usr/local/openresty/nginx/conf/ssl/ca.crt;
        # 開啓瀏覽器證書驗證
        ssl_verify_client on;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
		ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
		
		location /esns-server {
          access_by_lua_file '
              local res = ngx.location.capture("/auth",{method = ngx.HTTP_POST})
              if res.status == ngx.HTTP_OK then
	           return
	          end
	         if res.status == ngx.HTTP_FORBIDDEN then
		       ngx.exit(res.status)
	         end
	        ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
         ';
	     proxy_pass https://192.168.2.1/server;
		 proxy_read_timeout 150;
	    }
		
       # 鑑權開始
		location  /auth {
			proxy_pass https://192.168.1.1:8080/authentication;
			proxy_pass_request_body off;
            proxy_set_header Content-Length "";
			proxy_set_header Host $host:$proxy_port;
            proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header X-Original-URI $server_url;
			proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;     
            proxy_set_header  Cookie $http_cookie;
			proxy_read_timeout 150;
			# 解析證書信息
			proxy_set_header X-SSL-Client-S-DN $ssl_client_s_dn;
			# 解析狀態
            proxy_set_header X-CLIENT-VERIFY $ssl_client_verify;
			# 關鍵參數:這個變量開啓後,才能自定義錯誤頁面,當後端返回404,nginx攔截錯誤定義錯誤頁面
			proxy_intercept_errors on;
			
		}
		
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
		# 後期自定義404頁面
		error_page  404 /404.html;
		location = /404.html {
           root   html;
        }
		# 自定義403頁面 
		error_page  403  /403.html; 
		location = /403.html {
           root   html;
        }
		
		location = /favicon.ico {
	        log_not_found off;
	        access_log off;
        }
    }

二、說明cookie

注:ssl_certificate 和 ssl_certificate_key 的路徑就是咱們ssl證書申請的路徑session

ssl_certificate證書實際上是個公鑰,它會被髮送到鏈接服務器的每一個客戶端,ssl_certificate_key私鑰是用來解密的,因此它的權限要獲得保護但nginx的主進程可以讀取。固然私鑰和證書能夠放在一個證書文件中,這種方式也只有公鑰證書才發送到client。加密

ssl_session_timeout 客戶端能夠重用會話緩存中ssl參數的過時時間,內網系統默認5分鐘過短了,能夠設成30m即30分鐘甚至4h。

ssl_protocols指令用於啓動特定的加密協議,nginx在1.1.13和1.0.12版本後默認是ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2TLSv1.1TLSv1.2要確保OpenSSL >= 1.0.1 ,SSLv3 如今還有不少地方在用但有很多被攻擊的漏洞。

ssl_ciphers選擇加密套件,不一樣的瀏覽器所支持的套件(和順序)可能會不一樣。這裏指定的是OpenSSL庫可以識別的寫法,你能夠經過 openssl -v cipher ‘RC4:HIGH:!aNULL:!MD5’(後面是你所指定的套件加密算法) 來看所支持算法。

ssl_prefer_server_ciphers on設置協商加密算法時,優先使用咱們服務端的加密套件,而不是客戶端瀏覽器的加密套件。

在鑑權的location中,請求頭中會帶有以下屬性,根據下面的屬性就能驗證證書信息是否正確。

當瀏覽器有對應的證書時ssl_client_verify對應的值爲SUCCESS, ssl_client_s_dn對應的值就是證書的信息

# 解析證書信息
proxy_set_header X-SSL-Client-S-DN $ssl_client_s_dn;
# 解析狀態
proxy_set_header X-CLIENT-VERIFY $ssl_client_verify;

關於上面說到的自定義頁面,可是如何在自定義頁面上加載nginx本地的圖片呢?

location =/404.png{
    # 圖片存放路徑
	root  html/images;
	access_log off;
	expires 30d;
}

而後在自定義頁面上添加以下內容

<div class="wrap">
    <div class="logo">
        <img src="https://域名/images/404.png" alt=""  />
        <p>sorry 您要查看的頁面不存在或已刪除</p>
    </div>
</div>

最後啓動nginx,就能夠看到效果了。

相關文章
相關標籤/搜索