我正在寻找一种设置,我想为除一个源 IP 之外的所有 IP 提供 SSL 客户端证书。
我的想法是设置
ssl_verify_client optional;
并向位置添加详细的 if 语句。但是我不知道如何编写这样的 if 语句。
# this requires ssl client certificates for all locations
location / {
if ($ssl_client_verify != "SUCCESS") {
return 403;
...
}
# now what to write to require ssl certs except if source IP is e.g. 1.2.3.4
location /two {
if (?????) {
return 403;
...
}
编辑:附加信息
带有该值的开关ssl_verify_clientoptional
告诉客户端,他们可以但不必发送客户端证书。
因此,通过检查变量$var_ssl_client_verify我可以查看是否提供了客户端证书并且是否有效(SUCCESS
)。此规则应适用于没有给定源 IP 的所有客户端。对于一个特定的源 IP,我不想验证客户端证书。
我需要的是类似
if ($ssl_client_verify != "SUCCESS" and source_ip != 1.2.3.4 ) {
return 403;
}
编辑 2:我将标题从更改为
setup nginx to require client certs for all but a given source IP
,
setup nginx to require certain conditions of a location for all but a given source IP
因为我真正苦苦挣扎的内容与客户端证书无关,而是结合 if 语句和有条件地对源 IP 地址进行过滤。
if
Nginx for语句不支持多个条件。因此,作为一种解决方法并在我们的用例中评估客户端 IP,该解决方案的实现方式类似于https://www.nginx.com/blog/rate-limiting-nginx/#Advanced-Configuration-例子。基本上,解决方案是这样的......基本上,我们将值“SUCCESS”分配给特定 IP 的变量。对于每个其他 IP,我们分配 的实际值
$ssl_client_verify
。替代答案