Nginx#

Vous pouvez configurer nginx pour utiliser NetHSM via le moteur OpenSSL qui utilise alors le module PKCS#11 de NetHSM.

Le fichier de certificat doit se trouver sur le disque, mais la clé privée peut être utilisée à partir du NetHSM.

Un exemple complet est disponible à l’adresse ci-dessous.

Configuration d’OpenSSL#

Configurez le moteur OpenSSL en suivant le guide d’installation du moteur OpenSSL ` <openssl.html#engine>` __.

Les fournisseurs ne sont pas encore pris en charge par Nginx.

Note

L’utilisation du moteur OpenSSL libp11 version 0.4.12 ou plus ancienne et d’un NetHSM avec beaucoup de clés rendra le chargement initial de Nginx lent (plus d’une minute pour 1 millier de clés). Il est recommandé d’utiliser la version 0.4.13 ou plus récente ou de construire le moteur à partir de la source ` <https://github.com/OpenSC/libp11>` __.

Configuration de 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;
    }
}

L’adresse ssl_certificate doit pointer vers un fichier de certificat sur le disque.

Le ssl_certificate_key peut être une configuration OpenSSL. Ici, nous utilisons le moteur OpenSSL avec le module PKCS#11 et sélectionnons la clé privée avec le label/ID webserver et le type de clé private.

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

Note

Vous devez générer le certificat séparément, puis le télécharger dans le NetHSM. Si le certificat sur le disque et la clé dans le NetHSM ne correspondent pas, nginx ne démarrera pas.

libnethsm_pkcs11 Configuration#

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

Pour sécuriser le mot de passe, vous pouvez le fournir via une variable d’environnement (voir Setup) ou le fournir dans la configuration de nginx :

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

Exemple#

Si vous voulez expérimenter avec l’exemple donné utilisez git pour cloner le dépôt nethsm-pkcs11 et exécutez les commandes suivantes :

Avertissement

L’exécution du script de génération supprime la clé webserver et la remplace.

  1. Configurer un NetHSM, soit un vrai, soit un conteneur. Voir le guide de démarrage ` <getting-started>` __ pour plus d’informations.

  2. Si votre NetHSM ne fonctionne pas sur localhost, vous devrez modifier l’URL des requêtes curl dans container/nginx/generate.sh pour pointer vers votre NetHSM.

  3. Modifiez la configuration de libnethsm_pkcs11 pour qu’elle corresponde à votre NetHSM dans container/ejbca/p11nethsm.conf.

  4. Générer le certificat et la clé.

./container/nginx/generate.sh
  1. Construire le conteneur.

docker build -f container/nginx/Dockerfile . -t pkcs-nginx
  1. Exécuter le conteneur.

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

Le conteneur sera disponible à l’adresse suivante : https://localhost:9443/.