除了通常的 CA 链验证之外,我还希望 Nginxserver
部分仅允许特定的客户端证书指纹。
我可以找到如何检查单个指纹,但我不确定如何组合多个指纹,因为 Nginx 不支持or
,并且map
不允许在server
部分内。
所以,现在我有一个像这样的丑陋的解决方法:
ssl_client_certificate /usr/local/share/ca-certificates/trusted_chain.pem;
ssl_verify_client on;
ssl_verify_depth 3;
if ( $ssl_client_fingerprint = "12a4f0abc935cc0dd0f6fdcc0d56682d7f5c15a1" ) {
set $whiteclient 1;
}
if ( $ssl_client_fingerprint = "12a4f0abc935cc0dd0f6fdcc0d56682d7f5c15a2" ) {
set $whiteclient 1;
}
if ( $ssl_client_fingerprint = "12a4f0abc935cc0dd0f6fdcc0d56682d7f5c15a3" ) {
set $whiteclient 1;
}
if ( $whiteclient != 1 ) {
return 403;
}
有没有更好的方法来做到这一点?
答案1
NGINX 支持正则表达式匹配if
状况因此您可以执行以下操作:
if ($ssl_client_fingerprint !~ "12a4f0abc935cc0dd0f6fdcc0d56682d7f5c15a1|12a4f0abc935cc0dd0f6fdcc0d56682d7f5c15a2|12a4f0abc935cc0dd0f6fdcc0d56682d7f5c15a3") {
return 403
}
显然这条线可以得到相当长但根据口味/使用情况,它可能更可取。