nops
@nops
Системный инженер.

Проксирование в nginx с клиентскими сертификатами?

Доброго всем здравия коллеги.
Сразу к делу.
Есть сервер Apache, на нем настроен доступ к алиасам по клиентским сертификатам. Апач сам по себе работает и без нареканий, но сейчас захотелось маштабираемости ввиду увеличение хостов, требующих ssl.
Имеем один белый IP, внутри за NAT-ом стоит сервер на котором вертится Apache и на нем народ авторизовывается по сертификатам. 443 порт просто проброшен на эту машину. Сейчас я хочу на роутере поставить NGINX, который будет проксировать запросы на нужный сервер.
Задача оставить возможность авторизовываться по сертификатам.
в паче есть предположительно 3 алиаса:
/user
/admin
/guest
в конфете апача прописано вот так:

SSLVerifyClient require
SSLVerifyDepth 1
SSLOptions +OptRenegotiate
SSLCipherSuite HIGH:MEDIUM
SSLCACertificateFile "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/ssl/ca.cer"
SSLRequire %{SSL_CLIENT_S_DN_Email} eq "email@mail.ru" and %{SSL_CLIENT_M_SERIAL} eq "Serial-1" \
or %{SSL_CLIENT_S_DN_Email} eq "email2@mail.ru" and %{SSL_CLIENT_M_SERIAL} eq "Serial-2" \
or %{SSL_CLIENT_M_SERIAL} eq "Serial-3" \
or %{SSL_CLIENT_S_DN_Email} eq "email3@mail.ru" and %{SSL_CLIENT_M_SERIAL} eq "Serial-4" \
or %{SSL_CLIENT_M_SERIAL} eq "Serial-5"

Все дело в том, что в /user должны иметь доступ только админы и юзеры.
в /admin только админы
в /guest все и юзеры и админы и гости.
Я думал сделать авторизацию в NginX, но там нет возможность использовать вложенные условия или значения "или" (OR,AND,||,&&). Попробовал прописать в конфете так:
# if ($ssl_client_serial !~ "Serial-1") {return 401;}
# if ($ssl_client_serial !~ "Serial-2") {return 401;}
# if ($ssl_client_serial !~ "Serial-3") {return 401;}

Но в случае несовпадения хоть одного, выкидывает с 401-й ошибкой.
Пробовал заюзать map, но ее можно использовать только в директиве http{}

Я хочу:
либо сделать проверку сертификата в nginx, с ограничением доступа,
либо сделать проброс/проксирование сертификата в апач, чтобу уже он проверял сертификат.

Подскажите пожалуйста, как такое возможно реализовать?
  • Вопрос задан
  • 655 просмотров
Решения вопроса 1
Winsik
@Winsik
сис.админ, недопрограммист :)
можно как то так, если переделать ваш вариант:
# set $true 0;
# if ($ssl_client_serial = "Serial-1") {set $true 1;}
# if ($ssl_client_serial = "Serial-2") {set $true 1;}
# if ($ssl_client_serial = "Serial-3") {set $true 1;} 
# if ($true=0) {return 401;}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы