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"

To secure the password you can provide it via an environment variable) or provide it in the nginx configuration:

ssl_certificate_key "engine:pkcs11:pkcs11:object=webserver;type=private;pin=opPassphrase";

Пример

Если вы хотите поэкспериментировать с приведенным примером, используйте git для клонирования репозитория nethsm-pkcs11 и выполните следующие команды:

Предупреждение

Запуск скрипта generate удаляет ключ webserver и заменяет его.

  1. Configure a NetHSM, either a real one or a container. See the getting-started guide for more information. Besides an administrator, you are going to need an operator account.

  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. Create a NetHSM PKCS11 configuration file in one of the known locations, e.g., /etc/nitrokey/p11nethsm.conf. It must have configured an operator account and use the same NetHSM instance specified in the generate script before.

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

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

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

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

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

The NGINX test page will be available at https://localhost:9443/. Note that your browser, will warn you that the websites certificate is self-signed.