Proxy支持https证书验证
目录 |
Proxy支持https证书验证
概要
本功能在nginx原有的proxy模块上增加了设置证书的功能,在连接后端的https服务器时,可以使用设置的证书进行ssl握手,此项功能主要用于在后端的https服务器开启了“客户端证书验证”的情况下,可以握手成功。
此外,还增加了对服务器证书验证的功能,即:可以在SEnginx上设置给服务器证书签名的CA证书,用于对服务器进行验证。
本功能在1.5.13版本中引入。
命令
proxy_ssl_certificate
语法 | proxy_ssl_certificate file; |
默认值 | - |
上下文 | HTTP/Server/Location |
指定一个证书和后端https服务器握手的时候使用。此证书为PEM格式,此命令的其他行为类似于nginx的ssl_certificate命令
举例:
proxy_ssl_certificate certs/client.crt;
proxy_ssl_certificate_key
语法 | proxy_ssl_certificate_key file; |
默认值 | - |
上下文 | HTTP/Server/Location |
指定一个和证书匹配的私钥,格式为PEM。此命令的其他行为类似于nginx的ssl_certificate_key命令
举例:
proxy_ssl_certificate_key certs/client.key;
proxy_ssl_verify_server
语法 | proxy_ssl_verify_server off/on/optional/optional_no_ca; |
默认值 | off |
上下文 | HTTP/Server/Location |
开启服务器证书验证功能,此命令的参数的含义和nginx的ssl_verify_client命令的含义一致
proxy_ssl_verify_depth
语法 | proxy_ssl_verify_depth number; |
默认值 | 1 |
上下文 | HTTP/Server/Location |
指定证书链的验证深度,此命令的行为和nginx的ssl_verify_depth命令类似
proxy_ssl_server_certificate
语法 | proxy_ssl_server_certificate file; |
默认值 | - |
上下文 | HTTP/Server/Location |
指定用于验证服务器证书的CA证书,PEM格式,此命令的行为和nginx的ssl_client_certificate命令类似
例子
用openssl命令准备如下证书/私钥:
- ca.crt
- server.crt/server.key
- client.crt/client.key
其中,server.crt和client.cert用同一个CA生成,ca.crt为此CA的证书。server.key和client.key是对应的私钥文件。将server.crt/server.key/ca.crt复制到后端服务器上,将client.crt/client.key/ca.crt复制到SEnginx所在的反向代理服务器上。
服务器要求客户端验证的例子
后端服务器端的设置,创建一个server,开启https并进行客户端证书验证,一下是SEnginx/nginx的设置,也可以用其他的web server软件:
server { listen 443 ssl; ssl_certificate certs/server.crt; ssl_certificate_key certs/server.key; ssl_verify_client on; ssl_client_certificate certs/ca.crt; ... }
反向代理服务器的设置:
backend { server some-ip:443; } server { listen 80; location / { proxy_ssl_certificate certs/client.crt; proxy_ssl_certificate_key certs/client.key; proxy_pass https://backend; } }
双向认证的例子
后端服务器设置不变,反向代理服务器的设置:
backend { server some-ip:443; } server { listen 80; location / { proxy_ssl_certificate certs/client.crt; proxy_ssl_certificate_key certs/client.key; proxy_ssl_verify_server on; proxy_ssl_server_certificate certs/ca.crt; proxy_pass https://backend; } }