Nginx 客户端证书认证:如何排除 IP 地址

Nginx 客户端证书认证:如何排除 IP 地址

我有 Nginx 作为 Web 服务器的代理运行,并且我想使用 TLS/SSL 客户端证书来保护访问。

这是我的 SSL 配置

server {
    listen                  443 ssl; 
    server_name             www.domain.com;
    ssl_certificate         /etc/nginx/ssl/domain/server.crt; 
    ssl_certificate_key     /etc/nginx/ssl/domain/server.key; 
    ssl_client_certificate  /etc/nginx/ssl/clients/client_ca.pem
    ssl_verify_client on;

它运行得很好 - 但现在我需要允许从一个特定的 IP 地址访问我的网站,而不需要客户端证书。

有没有可能用 nginx 来做到这一点?

谢谢 :-)

答案1

这是我的解决方案:

server {
    listen                  443 ssl; 
    server_name             www.domain.com;
    ssl_certificate         /etc/nginx/ssl/domain/server.crt; 
    ssl_certificate_key     /etc/nginx/ssl/domain/server.key; 
    ssl_client_certificate  /etc/nginx/ssl/clients/client_ca.pem
    ssl_verify_client       optional;

    # Set global proxy settings
    proxy_read_timeout      360;
    proxy_pass_header       Date;
    proxy_pass_header       Server;
    proxy_set_header        Host $host;
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header        Accept-Encoding "";


    location /
    {

    if ($remote_addr = 1.2.3.4 ) 
       {
        proxy_pass http://10.10.10.1; 
        break; 
       }

    if ($ssl_client_verify != "SUCCESS") 
       { return 403; }

    proxy_pass http://10.10.10.1;}

    error_log /var/log/nginx/domain-error.log;
    access_log /var/log/nginx/domain-access.log;
}

IP 1.2.3.4 无需客户端证书即可访问网站:-)

答案2

简单的解决方案是创建一个server具有不同域名的重复容器,该容器已ssl_verify_client关闭,并采用某种形式的allow/方案。deny

可以设置ssl_verify_client optional然后手动验证客户端,但无论如何都会提示您的客户端输入证书,因此这可能会让您的用户感到烦恼。

相关内容