Перейти к основному содержанию

Nginx — включаем постквантовую криптографию в Ubuntu 22

Nginx

Сегодня боремся с квантовыми мельницами.

Постквантовая криптография (Post-Quantum Cryptography) — 'новые математические алгоритмы шифрования, которые останутся устойчивыми даже когда появятся достаточно мощные квантовые компьютеры.

Алгоритмы PQC необходимы для обеспечения квантово-устойчивой архитектуры.

Современные квантовые компьютеры способны решать задачи, которые обычным компьютерам не под силу. К таким задачам относится расшифровка современных алгоритмов шифрования. Мощность квантовых компьютеров растёт, скоро настанет такой день, когда такой компьютер сможет выполнить такую расшифровку за секунды. Такой условный день имеет свой название: квантовый день, Q-Day или день Q.

Еще пару лет назад эксперты говорили о 2040 годе. Сейчас цифры изменились, Google, IBM и Cloudflare независимо друг от друга назначили внутренний дедлайн — 2029 год. 22 июня 2026 года Дональд Трамп подписал указ, который обязал все федеральные системы США перейти на новую, постквантовую криптографию к 2030 году.

В августе 2024 года Национальный институт стандартов и технологий США (NIST) утвердил три постквантовых стандарта:

  • FIPS 203 (ML-KEM) — механизм инкапсуляции ключейна основе CRYSTALS-Kyber
  • FIPS 204 (ML-DSA) — алгоритм цифровой подписи на основе CRYSTALS-Dilithium
  • FIPS 205 (SLH-DSA) — алгоритм цифровой подписи на основе хеш-функций (SPHINCS+)

Три этих алгоритма уже реализованы в основных криптографических библиотеках (OpenSSL 3.5, BoringSSL, libsodium) и доступны для внедрения. В России разрабатываются свои алгоритмы: Шиповник, Гиперикум и Кодиеум. 

Квантовый апокалипсис отменяется?

Постквантовые алгоритмы шифрования уже доступны, их можно пощупать, протестировать. Попробуем включить такой алгоритм в Nginx на Ubuntu.

OpenSSL и Linux

OpenSSL — одна из самых известных криптографических библиотек, которая входит в состав самых популярных дистрибутивов Linux. Криптографическая библиотека — это набор сертифицированных алгоритмов безопасности для работы с сигнатурами, шифрованием и сертификатами. Такое программное обеспечение, как NGINX, подключается к OpenSSL для шифрования HTTPS.

В версии OpenSSL 3.5, выпущенной в апреле 2025 года, по умолчанию включены несколько алгоритмов PQC, одобренных Национальным институтом стандартов и технологий США. Это значит, что если вы хотите включить PQC в своем экземпляре NGINX с открытым исходным кодом, убедитесь, что NGINX скомпилирован с использованием версии OpenSSL ≥3.5.

А если OpenSSL 3.0.x, используемый в некоторых современных дистрибутивах, не поддерживает алгоритмы PQC, то можно получить поддержку PQC с помощью провайдера OQS. Если вы используете OpenSSL 3.0.x или 3.1.x, имейте в виду, что постквантовые алгоритмы подписи нельзя использовать для аутентификации на сервере по протоколу TLS 1.3. Это известное ограничение, которое было устранено в OpenSSL 3.2+.

Учитывая, что OpenSSL 3.5 был выпущен в начале 2025 года, в дистрибутивах Linux есть лишь несколько вариантов с версией ≥3.5.

  • ✅Debian 13, OpenSSL 3.5.x
  • ❌Debian 12, OpenSSL 3.0.x, есть обходной путь
  • ✅Alpine Linux 3.22, OpenSSL 3.5.x
  • ❌Alpine Linux 3.21, OpenSSL 3.3.x
  • ❌Ubuntu 22, OpenSSL 3.0.x, есть обходной путь
  • ❌Ubuntu 24, OpenSSL 3.0.x, есть обходной путь
  • ✅Alma/Rocky/RHEL 10.1, OpenSSL 3.5.x
  • ❌Alma/Rocky/RHEL 10, OpenSSL 3.2.x, есть обходной путь
  • ✅Suse Linux Enterprise (SLES) 16, OpenSSL 3.5.x

Включаем PQC в Ubuntu 22

Проверим текущую ОС:

cat /etc/*release*

pqc

У нас Ubuntu 22. Проверим Nginx:

nginx -V
pqc

На борту Nginx 1.29.5, скомпилирован с использованием версии OpenSSL 3.0.2, в которой нет постквантовых алгоритмов шифрования.

Проверить, используется ли на сайте PQC, можно здесь:

https://www.ssllabs.com/

pqc

This server does not support PQC (Post-Quantum Cryptography) key exchange

Добавим поддержку PQC в NGINX, установив проекты liboqs и oqs-provider.

Устанавливаем инструменты для сборки:

sudo apt install -y build-essential git cmake ninja-build libssl-dev

Клонируем проект liboqs, собираем м устанавливаем:

cd ~
git clone --branch main https://github.com/open-quantum-safe/liboqs.git
cd liboqs && mkdir build && cd build
cmake -GNinja -DCMAKE_INSTALL_PREFIX=/usr/local -DOQS_DIST_BUILD=ON ..
ninja
sudo ninja install

Клонируем проект oqs-provider, собираем м устанавливаем:

cd ~
git clone --branch main https://github.com/open-quantum-safe/oqs-provider.git
cd oqs-provider && mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local -DOPENSSL_ROOT_DIR=/usr/local/ssl ..
make -j$(nproc)
sudo make install

Создаём конфигурацию OpenSSL в файле /etc/ssl/openssl-oqs.cnf с помощью OQS-провайдера:

sudo tee /etc/ssl/openssl-oqs.cnf > /dev/null <<'EOF'

openssl_conf = openssl_init

[openssl_init]
providers = provider_sect

[provider_sect]
default = default_sect
oqsprovider = oqsprovider_sect

[default_sect]
activate = 1

[oqsprovider_sect]
activate = 1
# For ARM based machines replace x86_64 with aarch64
module = /usr/lib/x86_64-linux-gnu/ossl-modules/oqsprovider.so
EOF
```

Вот пример конфигурации NGINX, в которой явно задана кривая PQC:

server {
 listen 443 ssl;
 server_name localhost;

 ssl_certificate /etc/ssl/private/localhost.crt;
 ssl_certificate_key /etc/ssl/private/localhost.key;

 ssl_protocols TLSv1.3;
 ssl_ecdh_curve X25519MLKEM768:X25519:prime256v1; # PQC + classical curves

 location / {
   root /var/www/html;
   index index.html;
 }
}

Тест конфигурации NGINX не проходит:

sudo nginx –t
nginx: [emerg] SSL_CTX_set1_curves_list("X25519MLKEM768:X25519:prime256v1") failed
nginx: configuration file /etc/nginx/nginx.conf test failed

Тест проходит при использовании среды OpenSSL с конфигурацией OQS-Provider:

sudo OPENSSL_CONF=/etc/ssl/openssl-oqs.cnf nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Чтобы подключить конфигурацию, нужно в Nginx добавить OPENSSL_CONF в переменные среды. В Systemd, Docker и Kubernetes есть возможность установить переменную среды. Здесь я немного помучился и смог засунуть переменную OPENSSL_CONF=/etc/ssl/openssl-oqs.cnf при старте Nginx, у вас тоже получится.

Снова проверяем сайт:

pqc

This server supports PQC (Post-Quantum Cryptography) key exchange

Квантовые мельницы побеждены.

 

Похожие материалы