Nginx#
Вы можете настроить nginx на использование NetHSM через механизм OpenSSL, который затем использует PKCS#11 модуль NetHSM.
Файл сертификата должен находиться на диске, но закрытый ключ может быть использован из NetHSM.
Полный пример приведен на сайте ниже.
Конфигурация OpenSSL#
Настройте механизм OpenSSL, следуя руководству по настройке механизма OpenSSL Engine.
Провайдеры пока не поддерживаются Nginx.
Примечание
Использование движка libp11 OpenSSL версии 0.4.12 или старше и NetHSM с большим количеством ключей приведет к замедлению начальной загрузки Nginx (более минуты для 1 тыс. ключей). Рекомендуется использовать версию 0.4.13 или новее или собирать движок из исходных текстов ` <https://github.com/OpenSC/libp11>` __.
Конфигурация Nginx#
ssl_engine pkcs11;
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /certs/certificate.pem;
ssl_certificate_key "engine:pkcs11:pkcs11:object=webserver;type=private";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10s;
ssl_session_tickets off;
ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers off;
# HSTS (ngx_http_headers_module is required) (63072000 seconds)
add_header Strict-Transport-Security "max-age=63072000" always;
# OCSP stapling
ssl_stapling on;
ssl_stapling_verify on;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
Адрес ssl_certificate
должен указывать на файл сертификата на диске.
В качестве ssl_certificate_key
может выступать конфигурация OpenSSL. Здесь мы используем движок OpenSSL с модулем PKCS#11 и выбираем закрытый ключ с меткой/идентификатором webserver
и типом ключа private
.
ssl_certificate_key "engine:pkcs11:pkcs11:object=webserver;type=private";
Примечание
Необходимо отдельно сгенерировать сертификат, а затем загрузить его в NetHSM. Если сертификат на диске и ключ в NetHSM не совпадают, nginx не запустится.
libnethsm_pkcs11 Конфигурация#
slots:
- label: LocalHSM
description: Local HSM (docker)
url: "https://192.168.3.161:8443/api/v1"
operator:
username: "operator"
password: "opPassphrase"
Для защиты пароля можно задать его через переменную окружения (см. Setup) или указать его в конфигурации nginx:
ssl_certificate_key "engine:pkcs11:pkcs11:object=webserver;type=private;pin=opPassphrase";
Пример#
Если вы хотите поэкспериментировать с приведенным примером, используйте git для клонирования репозитория nethsm-pkcs11 и выполните следующие команды:
Предупреждение
Запуск скрипта generate удаляет ключ webserver
и заменяет его.
Настройте NetHSM, либо реальный, либо контейнер. Дополнительную информацию см. в руководстве по началу работы ` <getting-started>` __.
Если ваш NetHSM работает не на localhost, то вам необходимо изменить URL-адрес запросов curl в
container/nginx/generate.sh
, чтобы он указывал на ваш NetHSM.Измените конфигурацию libnethsm_pkcs11 в соответствии с вашим NetHSM в разделе
container/ejbca/p11nethsm.conf
.Сгенерируйте сертификат и ключ.
./container/nginx/generate.sh
Постройте контейнер.
docker build -f container/nginx/Dockerfile . -t pkcs-nginx
Запустите контейнер.
docker run -p 9443:443 -p 9080:80 pkcs-nginx
Контейнер будет доступен по адресу https://localhost:9443/.