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

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

  2. Если ваш NetHSM работает не на localhost, то вам необходимо изменить URL-адрес запросов curl в container/nginx/generate.sh, чтобы он указывал на ваш NetHSM.

  3. Измените конфигурацию libnethsm_pkcs11 в соответствии с вашим NetHSM в разделе container/ejbca/p11nethsm.conf.

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

./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

Контейнер будет доступен по адресу https://localhost:9443/.