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,就能够看到效果了。

相关文章
相关标签/搜索