Nginx#

È possibile configurare nginx per utilizzare NetHSM tramite il motore OpenSSL che utilizza il modulo PKCS#11 di NetHSM.

Il file del certificato deve essere sul disco, ma la chiave privata può essere utilizzata dal NetHSM.

Un esempio completo è disponibile sotto.

Configurazione di OpenSSL#

Configurare il motore OpenSSL seguendo la guida alla configurazione di OpenSSL Engine.

I provider non sono ancora supportati da Nginx.

Nota

L’uso del motore OpenSSL libp11 versione 0.4.12 o precedente e di un NetHSM con molte chiavi renderà il caricamento iniziale di Nginx lento (più di un minuto per mille chiavi). Si consiglia di utilizzare la versione 0.4.13 o più recente o di creare il motore da ` <https://github.com/OpenSC/libp11>` __.

Configurazione di 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;
    }
}

Il campo ssl_certificate deve puntare a un file di certificato sul disco.

ssl_certificate_key può essere una configurazione OpenSSL. Qui si utilizza il motore OpenSSL con il modulo PKCS#11 e si seleziona la chiave privata con l’etichetta/ID webserver e il tipo di chiave private.

ssl_certificate_key «engine:pkcs11:pkcs11:object=webserver;type=private»;

Nota

È necessario generare il certificato separatamente e poi caricarlo su NetHSM. Se il certificato su disco e la chiave nel NetHSM non corrispondono, nginx non si avvia.

libnethsm_pkcs11 Configurazione#

slots:
  - label: LocalHSM
    description: Local HSM (docker)
    url: "https://192.168.3.161:8443/api/v1"
    operator:
      username: "operator"
      password: "opPassphrase"

Per proteggere la password è possibile fornirla tramite una variabile d’ambiente (vedere Setup) o fornirla nella configurazione di nginx:

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

Esempio#

Se volete sperimentare l’esempio ` <https://github.com/Nitrokey/nethsm-pkcs11/tree/main/container/nginx>` __ usate git per clonare il repository nethsm-pkcs11 ed eseguite i seguenti comandi:

Avvertimento

L’esecuzione dello script generate cancella la chiave webserver e la sostituisce.

  1. Configurare un NetHSM, sia esso reale o un contenitore. Per ulteriori informazioni, consultare la guida getting-started.

  2. Se il proprio NetHSM non è in esecuzione su localhost, è necessario cambiare l’URL delle richieste curl in container/nginx/generate.sh per puntare al proprio NetHSM.

  3. Modificare la configurazione di libnethsm_pkcs11 per adattarla al proprio NetHSM in container/ejbca/p11nethsm.conf.

  4. Generare il certificato e la chiave.

./container/nginx/generate.sh
  1. Costruire il contenitore.

docker build -f container/nginx/Dockerfile . -t pkcs-nginx
  1. Eseguire il contenitore.

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

Il contenitore sarà disponibile su https://localhost:9443/.