Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Для работы серверных компонентов системы на ОС Linux требуется веб-сервер, работающий в режиме работы обратного прокси-сервера.
Nginx — это HTTP-сервер и обратный прокси-сервер, почтовый прокси-сервер, а также TCP/UDP прокси-сервер общего назначения, продукт позиционируется производителем как простой, быстрый и надежный. 

Info
Для установки NGINX, должен быть подключен и настроен репозиторий пакетов nginx. Если это

...

небыло сделано автоматически, добавьте репозиторий вручную.

Ручное добавление репозитория nginxnginx 

RHEL и производные дистрибутивы

...

Для подключения yum-репозитория создайте файл с именем /etc/yum.repos.d/nginx.repo со следующим содержимым:

[nginxngproxy.confinx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
 
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

...

  1. Выпустить сертификат на УЦ, например, Microsoft CA, экспортировать данный сертификат в формате .pfx на машину с установленным nginx (с закрытым ключом, с цепочкой корневых/промежуточных УЦ), и сертификат корневого УЦ.

    Warning
    Субъект (Subject) сертификата должен содержать FQDN сервера
    Indeed CM
    Rutoken KeyBox.
    Дополнительное имя субъекта (Subject Alternative Name) сертификата должно содержать атрибут DNS-имя (DNS Name) (FQDN сервера
    Indeed CM
    Rutoken KeyBox). Например: redos.demo.local или соответствующую запись с подстановочными знаками, например: *. demo.local (Wildcard certificate).
    Улучшенный ключ (Enhanced Key Usage) сертификата должен содержать значение Проверка подлинности сервера (Server Authentication).
  2. Добавить сертификат корневого УЦ в доверенные на машине с установленным nginx.
    Для RHEL и производных дистрибутивов:

    sudo cp ./root-ca.crt /etc/pki/ca-trust/source/anchors/
    sudo update-ca-trust extract

    Для Debian и производных дистрибутивов:

    sudo cp ./root-ca.crt /usr/local/share/ca-certificates/
    sudo update-ca-certificates -f

  3. Разделить .pfx сертификат на файл цепочки сертификатов и ключ, сделать файл ключа без пароля (необходимо подставить имя импортированного файла вместо PFXFILE): 

    openssl pkcs12 -in PFXFILE.pfx -chain -nokeys | sed -ne '/-BEGIN CERTIFICATE/,/END CERTIFICATE/p' > SSL.crt
    openssl pkcs12 -in PFXFILE.pfx -nocerts -out SSLencrypted.key
    openssl rsa -in SSLencrypted.key -out SSL.key

    Файл цепочки сертификатов должен быть следующего вида:

    -----BEGIN CERTIFICATE-----
    #Ваш сертификат#
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    #Промежуточный сертификат#
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    #Корневой сертификат#
    -----END CERTIFICATE-----

  4. Скопировать файлы цепочки сертификатов и ключа в папку, которая будет указана в файле конфигурации nginx:

    sudo cp ./SSL.crt /etc/ssl/private/
    sudo cp ./SSL.key /etc/ssl/private/

Настройка конфигурационного файла

Для работы Indeed CM Рутокен KeyBox требуется настроить nginx, чтобы он обслуживал запросы и отправлял их на проксируемый адрес (сервис Indeed CMRutokenKeyBox).
Как работают nginx и его модули, определяется в конфигурационном файле, по умолчанию он называется nginx.conf и в зависимости от операционной системы расположен в каталоге /usr/local/nginx/conf, /etc/nginx или /usr/local/etc/nginx

...

КонтекстДирективаЗначение по умолчаниюРекомендуемое значениеКомментарий
http


proxy_buffer_size4k|8k16kУвеличивается размер прокси буферов для передачи необходимой информации в http-запросах.
proxy_buffers8 4k | 8 8k4 16kУвеличивается размер прокси буферов для передачи необходимой информации в http-запросах.
types_hash_max_size10244096Увеличивается размер хэш-таблиц для хранения информации в виду большого количества проксируемых сервисов.
server




listen

80

443 ssl

Изменяется порт прослушивания на протокол HTTPS, по умолчанию nginx настроен на HTTP.

3003 ssl

Порт 3003 указывается для дополнительного контекста server в случае использования агентского функционала Indeed CMагентской функциональности Рутокен KeyBox.  

server_name** Требуется указать, обычно совпадает с именем машины, на которой установлен nginx.
Используется для фильтра обработки запросов.
ssl_certificate/etc/ssl/private/SSL.crtДля работы по HTTPS указывается путь к файлу с цепочкой сертификатов (SSL сертификат,  сертификаты промежуточного и корневого УЦ). 
ssl_certificate_key/etc/ssl/private/SSL.keyДля работы по HTTPS указывается путь к закрытому ключу SSL сертификата. 
ssl_verify_clientoffoptional_no_caДобавляется в случае авторизации по сертификату (используется клиентскими агентами)
locationproxy_pass*

* Один экземпляр контекста location направляет запросы на один адрес - сервис Indeed CMRutokenKeyBox. Таким образом контекстов location должно быть столько, сколько есть сервисов Indeed CMRutokenKeyBox.

Точка проксирования указывается в формате:
http://localhost:*PORT*/cm/*SERVICENAME*
http://localhost:*PORT*/*AGENTSERVICENAME*

Где необходимо указать PORT — порт, на котором запущен сервис Indeed CMRutokenKeyBox, а также SERVICENAME и AGENTSERVICENAME — имя запущенного сервиса. 

include /etc/nginx/conf.d/proxy.confНекоторые директивы описываются для каждого location, и для компактности конфигурационного файла рекомендуется создать файл с часто используемым набором директив и подключать его в каждый location вместо описывания набора целиком.
proxy_http_version1.01.1Версия 1.1 рекомендуется для keepalive подключений и NTLM аутентификации.
proxy_cache_bypass$http_upgradeОпределяет условия, при которых ответ не будет браться из кэша.
proxy_set_headerUpgrade $http_upgradeОпределяет переход с HTTP/1.1 на Web-socket после установления соединения.
Connection keep-aliveДля использования keepalive подключений.
Host $hostДля сохранения в заголовках имени nginx сервера при их передаче сервисам Indeed CMRutokenKeyBox.
X-Real-IP $remote_addr

По умолчанию, работа в режиме обратного прокси использует нестандартные заголовки о пользовательском IP адресе, что требует задания данной директивы.

X-Forwarded-For $proxy_add_x_forwarded_forПодобно X-Real-IP $remote_addr, определяет формирование заголовка для корректного проксирования. Если поле X-Forwarded-For не присутствовало в изначальном заголовке, то $proxy_add_x_forwarded_for = $remote_addr.
X-Forwarded-Proto $schemeВеб-сервер принимает запросы по HTTPS и проксирует их к HTTP сервисам Indeed CMRutoken KeyBox. Для корректной подмены протокола.
fastcgi_buffers8 4k|8k16 16kОпределяет количество и размер буферов для чтения ответов от FastCGI сервера, на одно подключение.
fastcgi_buffer_size4k|8k32kОпределяет размер буфера для чтения первой части ответа от FastCGI сервера.
proxy_set_headerx-ssl-client-cert $ssl_client_escaped_certДиректива при проксировании передавать клиентский сертификат, используется для авторизации по сертификату (используется клиентскими агентами).

...

  1. Создайте файл с многократно используемыми директивами. Возможно разместить такой файл с расширением .conf в каталоге /etc/nginx/conf.d/.

    Рекомендуемое содержимое файла: 

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection keep-alive;
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    fastcgi_buffers 16 16k;
    fastcgi_buffer_size 32k;

  2. Сконфигурируйте основной файл конфигурации nginx.

    Warning
    Имена контекстов location должны совпадать с путем к проксируемому сервису.

    Пример файла nginx.conf, сконфигурированного для работы с Indeed CMRutokenKeyBox:

    user nginx;
    worker_processes auto;
    error_log /var/log/nginx/error.log notice;
    events {    worker_connections 1024;    }
     
    http {
        proxy_buffer_size   16k;
        proxy_buffers   4 16k;
        types_hash_max_size  4096;
     
        log_format  main  '[$time_local] $remote_addr VIA $scheme --- $status --- $request \n $ssl_client_fingerprint';
        access_log  /var/log/nginx/access.log  main;
        sendfile                on;
        tcp_nopush              on;
        include                 /etc/nginx/mime.types;
        default_type            application/octet-stream;
         
        server {
            listen              443 ssl;
            server_name         redos.demo.local;
     
            ssl_certificate     "/etc/ssl/private/SSL.crt";
            ssl_certificate_key "/etc/ssl/private/SSL.key";
     
            location /cm/oidc
             {   include /etc/nginx/conf.d/proxy.conf;  
                    proxy_pass http://localhost:5000/cm/oidc;  }
            location /cm/mc
                {   include /etc/nginx/conf.d/proxy.conf;  
                    proxy_pass http://localhost:5001/cm/mc;    }
            location /cm/ss
                {   include /etc/nginx/conf.d/proxy.conf;  
                    proxy_pass http://localhost:5002/cm/ss;    }
            location /cm/rss
                {   include /etc/nginx/conf.d/proxy.conf;  
                    proxy_pass http://localhost:5003/cm/rss;    }
            location /cm/api
                {   include /etc/nginx/conf.d/proxy.conf;  
                    proxy_pass http://localhost:5004/cm/api;    }
            location /cm/credprovapi
             {   include /etc/nginx/conf.d/proxy.conf;  
                    proxy_pass http://localhost:5005/cm/credprovapi;    }
        }
         
        server {
            listen              3003 ssl;
            server_name         redos.demo.local;
     
            ssl_certificate     "/etc/ssl/private/SSL.crt";
            ssl_certificate_key "/etc/ssl/private/SSL.key";
            ssl_verify_client   optional_no_ca;
             
            location /agentregistrationapi 
                 {   include /etc/nginx/conf.d/proxy.conf;  
                    proxy_pass http://localhost:5006/agentregistrationapi;  }
            location /agentserviceapi      
             {   include /etc/nginx/conf.d/proxy.conf;  
                    proxy_pass http://localhost:5007/agentserviceapi;  
                    proxy_set_header x-ssl-client-cert $ssl_client_escaped_cert;  }
        }
    }

Изменения, сделанные в конфигурационном файле, не будут применены, пока nginx не будет отправлена команда перезагрузить конфигурацию или он не будет перезапущен. Для перезагрузки конфигурации выполните команду:

nginx -s reload

Файлы

proxy.conf

nginx.conf