Сегодня боремся с квантовыми мельницами.
Постквантовая криптография (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*У нас Ubuntu 22. Проверим Nginx:
nginx -V
На борту Nginx 1.29.5, скомпилирован с использованием версии OpenSSL 3.0.2, в которой нет постквантовых алгоритмов шифрования.
Проверить, используется ли на сайте 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, у вас тоже получится.
Снова проверяем сайт:

This server supports PQC (Post-Quantum Cryptography) key exchange
Квантовые мельницы побеждены.


