我想以这种方式配置 nginx,以便只有外部页面访问者(不是 192.169.1.0/24)需要使用客户端 SSL 证书进行身份验证。
我已经发现,可以通过 geo 模块区分外部用户和内部用户:
http {
geo $isintern {
default 0;
192.169.1.0/24 1;
}
通过:https://stackoverflow.com/questions/14811532/client-authentication-when-using-nginx-proxy-pass
我该如何配置服务器?我知道,应该尝试绕过 if 语句。最后,我想将有权访问的人重定向到 403/401 错误页面。
upstream serverapp {
server unix:/opt/a.socket;
}
server {
listen 443;
ssl on;
server_name example.com;
ssl_certificate /etc/nginx/certs/server.crt;
ssl_certificate_key /etc/nginx/certs/server.key;
ssl_client_certificate /etc/nginx/certs/ca.crt;
ssl_verify_client optional;
if(!$isintern) {
if($ssl_client_verify != SUCCESS) {
return 403;
}
}
error_page 403 401 /401.html
location / {
proxy_pass http://serverapp;
}
}
上述配置未经测试。它应该如何实现?
资源:
答案1
您需要两个server {}
块,一个用于外部访问,一个用于内部访问。Nginx 不会在意它们是否指向文件系统上的同一个根目录。理想情况下,为每个文件创建一个单独的文件,并将其放在主配置文件或其他配置文件所在的.conf
目录中。include
nginx.conf
每个server {}
块可以有自己的证书、自己的server_name
指令以使 SNI 正常工作,并且你可以使用以下方式限制内部站点的 IP 访问location / { allow IP/netmask; allow IP/netmask; deny all; }