Ssl Nginx条件客户端证书身份验证
我正在尝试使用Nginx代理流量。我在配置中有一个服务器块监听HTTPS,它提供有效的证书并检查客户端证书(双向ssl)。这个设置是可行的,但我希望能够允许我们的开发人员在不进行客户端证书验证的情况下访问服务器(因为他们显然不会进行验证)。我以前使用的配置是:Ssl Nginx条件客户端证书身份验证,ssl,nginx,configuration,ip,certificate,Ssl,Nginx,Configuration,Ip,Certificate,我正在尝试使用Nginx代理流量。我在配置中有一个服务器块监听HTTPS,它提供有效的证书并检查客户端证书(双向ssl)。这个设置是可行的,但我希望能够允许我们的开发人员在不进行客户端证书验证的情况下访问服务器(因为他们显然不会进行验证)。我以前使用的配置是: server { listen 443 ssl http2 default_server; server_name api.website.com; root /usr/share/n
server {
listen 443 ssl http2 default_server;
server_name api.website.com;
root /usr/share/nginx/html;
underscores_in_headers on;
ssl_certificate "/etc/pki/nginx/private/ServerCert.pem";
ssl_certificate_key "/etc/pki/nginx/private/ServerCert.pem";
ssl_client_certificate "/etc/pki/nginx/ClientCert.pem";
ssl_verify_client on;
ssl_verify_depth 2;
ssl_dhparam "/etc/pki/nginx/dhparams.pem";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 1m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:SEED:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!RSAPSK:!aDH:!aECDH:!EDH-DSS-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA:!SRP;
ssl_prefer_server_ciphers on;
include /etc/nginx/default.d/*.conf;
location /tomcat/endpoint {
proxy_pass http://localhost:8080/tomcat-war;
proxy_pass_request_headers on;
}
}
同样,这是可行的,但有效地锁定了除我添加到客户端证书存储中的证书之外的访问。一种解决方案是制作一个内部签名的证书,并将其添加到存储中,然后分发给我们的开发人员,但我更希望根据IP地址将开发人员排除在此类检查之外。我通过将ssl_client_verify更改为optional并将location块更改为以下内容来实现这一点:
location /tomcat/endpoint {
set $allowed 9;
if ($ssl_client_verify != "SUCCESS") { set $allowed 1;}
if ($not_internal_ip) { set $allowed "${allowed}1"; }
if ($allowed = 11) {
return 403;
}
proxy_pass http://localhost:8080/tomcat-war;
proxy_pass_request_headers on;
}
其中$not_internal_ip设置为地理块,如下所示:
geo $not_internal_ip {
default 0;
10.0.0.0/8 1;
172.16.0.0/12 1;
192.168.0.0/16 1;
}
尽管这是可行的,但我担心逻辑依赖于Nginx配置文件中的许多if语句
在位置块中使用If语句的这种方式是否安全?有更好的方法吗?您可以在不使用if语句的情况下也使用映射来执行此操作
geo $internal_ip {
default no;
10.0.0.0/8 yes;
172.16.0.0/12 yes;
192.168.0.0/16 yes;
}
map $internal_ip$ssl_client_verify $request_allowed {
~* "^yes" yes;
"noSUCCESS" yes;
default no;
}
map $request_allowed $proxy_pass_url {
yes "http://localhost:8080/tomcat-war/$request_uri";
no "/access-denied";
}
location /tomcat/endpoint {
proxy_pass $proxy_pass_url;
proxy_pass_request_headers on;
}
location /access-denied {
return 403;
}
PS:我没有测试过上面的配置,但我在过去使用过类似的方法您可以在不使用if语句的情况下也使用映射进行测试
geo $internal_ip {
default no;
10.0.0.0/8 yes;
172.16.0.0/12 yes;
192.168.0.0/16 yes;
}
map $internal_ip$ssl_client_verify $request_allowed {
~* "^yes" yes;
"noSUCCESS" yes;
default no;
}
map $request_allowed $proxy_pass_url {
yes "http://localhost:8080/tomcat-war/$request_uri";
no "/access-denied";
}
location /tomcat/endpoint {
proxy_pass $proxy_pass_url;
proxy_pass_request_headers on;
}
location /access-denied {
return 403;
}
PS:我没有测试过上面的配置,但我在过去使用过类似的方法我真的很喜欢它的发展方向,我知道它是如何工作的,但它如何适应多个位置?我在最初的帖子中没有这样说,但我实际上是在代理一些基于URI的不同战争。我想我可以用重写规则替换位置,但我更希望有单独的位置块。如果在
$request\u allowed
上使用,您可以使用一个位置块,然后使用该位置块,否则您必须将映射$request\u allowed$proxy\u pass\u url
更改为映射$request\u allowed$request\u uri$proxy\u pass\u url
,然后在映射中使用模式通过对了,我测试过了,效果很好。唯一需要更改的是正则表达式(应该是~*^yes)。我还选择了location块中的单个if语句。通过匹配否定条件并返回403,它不应该中断。谢谢你的帮助!我真的很喜欢它的发展方向,我知道它是如何工作的,但是它如何适应多个位置呢?我在最初的帖子中没有这样说,但我实际上是在代理一些基于URI的不同战争。我想我可以用重写规则替换位置,但我更希望有单独的位置块。如果在$request\u allowed
上使用,您可以使用一个位置块,然后使用该位置块,否则您必须将映射$request\u allowed$proxy\u pass\u url
更改为映射$request\u allowed$request\u uri$proxy\u pass\u url
,然后在映射中使用模式通过对了,我测试过了,效果很好。唯一需要更改的是正则表达式(应该是~*^yes)。我还选择了location块中的单个if语句。通过匹配否定条件并返回403,它不应该中断。谢谢你的帮助!