Доброго всем здравия коллеги.
Сразу к делу.
Есть сервер 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, с ограничением доступа,
либо сделать проброс/проксирование сертификата в апач, чтобу уже он проверял сертификат.
Подскажите пожалуйста, как такое возможно реализовать?