В дополнение к обычной проверке цепочки ЦС, я хотел бы, чтобы раздел Nginx server
разрешал только отпечатки определенных клиентских сертификатов.
Я мог бы найти, как проверить наличие одного отпечатка пальца, но я не уверен, как объединить несколько отпечатков пальцев, потому что 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;
}
Есть ли более приятный способ сделать это?
NGINX поддерживает сопоставление регулярных выражений в рамкахif
условий , так что вы можете сделать следующее:
if ($ssl_client_fingerprint !~ "12a4f0abc935cc0dd0f6fdcc0d56682d7f5c15a1|12a4f0abc935cc0dd0f6fdcc0d56682d7f5c15a2|12a4f0abc935cc0dd0f6fdcc0d56682d7f5c15a3") {
return 403
}
Очевидно, эта строка может получиться довольно длинной , но зависит от вкуса/ вариант использования может быть предпочтительнее.