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 и заменяет его.

  1. Настройте NetHSM, либо реальный, либо контейнер. Дополнительную информацию см. в руководстве по началу работы ` <getting-started.html>` __. Помимо администратора, вам понадобится учетная запись оператора.

  2. Загрузите и установите последнюю версию драйвера nethsm-pkcs11 , доступную отсюда.

  3. Установите механизм OpenSSL PKCS11, как описано в руководстве OpenSSL Manual. Вам не нужно создавать файл конфигурации.

  4. Настройте переменные 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.

  5. Создайте файл конфигурации NetHSM PKCS11 в одном из известных мест, например, /etc/nitrokey/p11nethsm.conf. В нем должна быть настроена учетная запись оператора и использоваться тот же экземпляр NetHSM, который был указан в сценарии генерации ранее.

  6. Обновите конфигурацию PKCS11 в разделе container/nginx/p11nethsm.conf, добавив URL-адрес NetHSMs и действительные учетные данные оператора.

  7. Сгенерируйте сертификат и ключ.

./container/nginx/generate.sh
  1. Постройте контейнер.

docker build -f container/nginx/Dockerfile . -t pkcs-nginx
  1. Запустите контейнер.

docker run -p 9443:443 -p 9080:80 pkcs-nginx

Тестовая страница NGINX будет доступна по адресу https://localhost:9443/. Обратите внимание, что ваш браузер, надеюсь, предупредит вас о том, что сертификат сайта является самоподписанным.