我有 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
然后手动验证客户端,但无论如何都会提示您的客户端输入证书,因此这可能会让您的用户感到烦恼。