У меня Nginx работает в качестве прокси для веб-сервера, и я хочу защитить доступ с помощью клиентских сертификатов TLS / SSL.
Это моя ssl-конфигурация
server {
listen 443 ssl;
server_name www.domain.com;
ssl_certificate /etc/nginx/ssl/domain/server.crt;
ssl_certificate_key /etc/nginx/ssl/domain/server.key;
ssl_client_certificate /etc/nginx/ssl/clients/client_ca.pem
ssl_verify_client on;
, она работает очень хорошо, но теперь мне нужно разрешить доступ к моему сайту без клиентских сертификатов с одного определенного IP-адреса.
Можно ли сделать это с помощью nginx?
Спасибо : -)
Это мое решение:
server {
listen 443 ssl;
server_name www.domain.com;
ssl_certificate /etc/nginx/ssl/domain/server.crt;
ssl_certificate_key /etc/nginx/ssl/domain/server.key;
ssl_client_certificate /etc/nginx/ssl/clients/client_ca.pem
ssl_verify_client optional;
# Set global proxy settings
proxy_read_timeout 360;
proxy_pass_header Date;
proxy_pass_header Server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Accept-Encoding "";
location /
{
if ($remote_addr = 1.2.3.4 )
{
proxy_pass http://10.10.10.1;
break;
}
if ($ssl_client_verify != "SUCCESS")
{ return 403; }
proxy_pass http://10.10.10.1;}
error_log /var/log/nginx/domain-error.log;
access_log /var/log/nginx/domain-access.log;
}
ip 1.2.3.4 может получить доступ к веб-сайту без сертификата клиента :-)
.Простым решением было бы создание дубликата контейнера сервера
с другим именем домена, в котором ssl_verify_client
отключен, и некая форма схемы allow
/deny
.
Можно установить ssl_verify_client опционально
, а затем вручную проверить клиента, но в любом случае вашим клиентам будет предложено выдать сертификат, так что это может быть раздражающим для ваших пользователей.