如何在 nginx 服务器配置中仅要求外部 IP 使用客户端 SSL 证书?

如何在 nginx 服务器配置中仅要求外部 IP 使用客户端 SSL 证书?

我想以这种方式配置 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目录中。includenginx.conf

每个server {}块可以有自己的证书、自己的server_name指令以使 SNI 正常工作,并且你可以使用以下方式限制内部站点的 IP 访问location / { allow IP/netmask; allow IP/netmask; deny all; }

相关内容