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/. Обратите внимание, что ваш браузер, надеюсь, предупредит вас о том, что сертификат сайта является самоподписанным.