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"
Чтобы защитить пароль, вы можете указать его через переменную окружения ` <pkcs11-setup.html#passwords>`__) или указать его в конфигурации nginx:
ssl_certificate_key "engine:pkcs11:pkcs11:object=webserver;type=private;pin=opPassphrase";
Пример#
Если вы хотите поэкспериментировать с приведенным примером, используйте git для клонирования репозитория nethsm-pkcs11 и выполните следующие команды:
Предупреждение
Запуск скрипта generate удаляет ключ webserver
и заменяет его.
Настройте NetHSM, либо реальный, либо контейнер. Дополнительную информацию см. в руководстве по началу работы ` <getting-started.html>` __. Помимо администратора, вам понадобится учетная запись оператора.
Загрузите и установите последнюю версию драйвера nethsm-pkcs11 , доступную отсюда.
Установите механизм OpenSSL PKCS11, как описано в руководстве OpenSSL Manual. Вам не нужно создавать файл конфигурации.
Настройте переменные
HOST
,ADMIN_ACCOUNT
иADMIN_ACCOUNT_PWD
вcontainer/nginx/generate.sh
таким образом, чтобыHOST
содержал URL и порт вашего NetHSM,ADMIN_ACCOUNT
содержал имя пользователя учетной записи администратора иADMIN_ACCOUNT_PWD
соответствующий пароль. Далее укажите абсолютный путь к движку OpenSSL PKCS11 вOPENSSL_PKCS11_ENGINE_PATH
и абсолютный путь к библиотеке NetHSM PKCS11 вNETHSM_PKCS11_LIBRARY_PATH
.Создайте файл конфигурации NetHSM PKCS11 в одном из известных мест, например,
/etc/nitrokey/p11nethsm.conf
. В нем должна быть настроена учетная запись оператора и использоваться тот же экземпляр NetHSM, который был указан в сценарии генерации ранее.Обновите конфигурацию PKCS11 в разделе
container/nginx/p11nethsm.conf
, добавив URL-адрес NetHSMs и действительные учетные данные оператора.Сгенерируйте сертификат и ключ.
./container/nginx/generate.sh
Постройте контейнер.
docker build -f container/nginx/Dockerfile . -t pkcs-nginx
Запустите контейнер.
docker run -p 9443:443 -p 9080:80 pkcs-nginx
Тестовая страница NGINX будет доступна по адресу https://localhost:9443/. Обратите внимание, что ваш браузер, надеюсь, предупредит вас о том, что сертификат сайта является самоподписанным.