Сборка и настройка nginx c поддержкой ГОСТ TLS
Опубликовано Николай Батищев on 2020-10-20 15:40

В инструкции описан процесс компиляции nginx 1.18 c поддержкой ГОСТ TLS. На примере Debian 10.
Для получения патча создайте заявку на портале технической поддержки.

1. Установка КриптоПро CSP.

tar -xvf ./linux-amd64_deb.tgz && cd ./linux-amd64_deb/
sudo ./install.sh
sudo dpkg -i ./lsb-cprocsp-devel_5.0.11823-6_all.deb

Активация лицензии
sudo /opt/cprocsp/sbin/amd64/cpconfig -license -set "Номер"

Проверка лицензии и количества подключений
/opt/cprocsp/sbin/amd64/cpconfig -license -check "Номер"

Проверка статуса лицензии
/opt/cprocsp/sbin/amd64/cpconfig -license -view

2. Установка дополнительных пакетов, получение исходных текстов

sudo apt-get install build-essential patch

wget https://ftp.pcre.org/pub/pcre/pcre-8.44.tar.gz
tar -xvf ./pcre-8.44.tar.gz && cd ./pcre-8.44
./configure && make

wget https://zlib.net/zlib-1.2.11.tar.gz
tar -xvf ./zlib-1.2.11.tar.gz

wget https://www.openssl.org/source/openssl-1.1.1h.tar.gz
tar -xvf ./openssl-1.1.1h.tar.gz

3. Сборка

./configure \
--user=nginx \
--group=nginx \
--with-cc-opt='-fstack-protector -fstack-protector-strong --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Werror=implicit-function-declaration -Winit-self -Wp,-D_FORTIFY_SOURCE=2 -fPIC' \
--with-ld-opt='-Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie -L/opt/cprocsp/lib/amd64 -lrdrsup -lssp -lcapi10 -lcapi20' \
--prefix=/opt/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--lock-path=/var/run/lock/nginx.lock \
--pid-path=/var/run/nginx.pid \
--with-pcre=/home/test/src/pcre-8.44/ \
--with-pcre-jit \
--with-zlib=/home/test/src/zlib-1.2.11/ \
--with-http_ssl_module \
--with-http_sspi_module \
--with-http_stub_status_module \
--with-openssl=../openssl-1.1.1g/ \
--with-openssl-opt='no-gost no-comp no-dtls no-deprecated no-dynamic-engine no-engine no-hw-padlock no-nextprotoneg no-psk no-tests no-ts no-ui-console no-ocsp' \
--with-stream \
--with-stream_ssl_module \
--with-stream_sspi_module \
--with-http_v2_module

Копирование базовый конфиг в директорию с кодом
sudo cp ./nginx.conf.sample ./nginx-1.18.0/conf/nginx.conf
make

sudo make install

Создание системного пользователя.
sudo adduser --system --no-create-home --group nginx
sudo chown -R nginx:nginx /var/log/nginx/

Перенос init скрипта.
sudo cp ./nginx.init /etc/init.d/nginx
sudo chmod +x /etc/init.d/nginx
sudo systemctl daemon-reload

4. Работа с ключами и сертификатами

Создавайте ключи без паролей!

Если у вас уже есть контейнер с ключем, то необходимо поместить его в /var/opt/cprocsp/keys/nginx/, изменить права, сделать владельцем пользователя от которого запускается nginx
chmod 700 /var/opt/cprocsp/keys/nginx/key_cont.000
chmod 600 /var/opt/cprocsp/keys/nginx/key_cont.000/*
chown -R nginx:nginx /var/opt/cprocsp/keys/nginx/key_cont.000/

Установка в хранилище всех сертификатов из всех доступных контейнеров
sudo -u nginx /opt/cprocsp/bin/amd64/csptest -absorb -certs -autoprov

Экспорт RSA ключа и сертификата из PFX
sudo -u nginx /opt/cprocsp/bin/amd64/certmgr -inst -provtype 24 -pfx -pin 123 -file ~/test.pfx

Установка корневых и промежуточных сертификатов
sudo -u nginx /opt/cprocsp/bin/amd64/certmgr -inst -store uRoot -file /path/to/root.cer
sudo -u nginx /opt/cprocsp/bin/amd64/certmgr -inst -store uCa -file /path/to/intermediate.cer

Генерация сертификата на тестовом УЦ КриптоПро
sudo -u nginx /opt/cprocsp/bin/amd64/cryptcp -creatcert -provtype 80 -rdn "CN=site.ru" -cont '\\.\HDIMAGE\srv' -certusage 1.3.6.1.5.5.7.3.1 -ku -du -both -exprt -ca http://testgost2012.cryptopro.ru/certsrv/

Получение серийного номера сертификата
sudo -u nginx /opt/cprocsp/bin/amd64/certmgr -list

Для режима двусторонней авутентификации (MutualTLS) необходимо установить корневые сертификаты клиентов в хранилище, указанное в конфиге (sspi_verify_client on; sspi_client_certificate TrustedCerts;)
sudo -u nginx /opt/cprocsp/bin/amd64/certmgr -inst -store uTrustedCerts -file /path/to/ClientRoot.cer

5. Запуск

Необходимо отредактировать /etc/nginx/nginx.conf, заменить серийный номер в sspi_certificate на свой.
sudo systemctl start nginx

6. Дополнительная информация

Ошибки при запуске логируются в /var/log/nginx/error.log или /var/log/syslog
При успешном запуске nginx откройте страницу https://site.ru и проверьте в адресной строке, что соединение зашифровано.
Так же можно пользоваться утилитой из состава CSP
"C:\Program Files\Crypto Pro\CSP\csptest.exe" -tlsc -server site.ru -port 443 -proto 6 -ciphers ff85:c100:c101:c102 -nosave -v
Более подробно
"C:\Program Files\Crypto Pro\CSP\csptest.exe" -tlsc -help

7. Пример конфигурационного файла

worker_processes 1;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
worker_rlimit_nofile 8192;
events {
    worker_connections 4096;
}
http {
    include conf/mime.types;
    index index.html index.htm index.php;
    default_type text/html;
    log_format main '$remote_addr - $remote_user [$time_local] $status '
        '"$request" $body_bytes_sent "$http_referer" '
        '"$http_user_agent" "$http_x_forwarded_for"';
    access_log /var/log/nginx/access.log main;
    server {
        listen 443;
        server_name t-nginx-gost.cp.ru;
        location / {
            root /var/www;
            index index.html;
        }
        sspi on;
        sspi_certificate 0x7C00013D42201F55870674C594000100013D421; # GOST Serial, необходимо ставить первым в список
        sspi_certificate 0x00E3CD25AA5310D07F; # RSA cert serial sspi_protocols TLSv1.2;
    }
}

(1 плюсик(ов))
Класс!
Не очень :(

Коментарии (0)