場景:接着筆記(三)的鑑權,須要先調用第三方服務進行鑑權,第三方對應的瀏覽器須要導入證書,不然就會報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.2,TLSv1.1與TLSv1.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,就能夠看到效果了。