Nginx

您可以配置`nginx<https://nginx.org/>`__,通过 OpenSSL 引擎使用 NetHSM,然后使用 NetHSM 的 PKCS#11 模块。

证书文件必须在磁盘上,但私钥可通过 NetHSM 使用。

完整的示例见`以下<#example>`__。

OpenSSL 配置

按照`OpenSSL 引擎设置指南<openssl.html#engine>`__设置 OpenSSL 引擎。

Nginx 尚不支持提供程序。

备注

使用 0.4.12 或更旧版本的 libp11 OpenSSL 引擎和带有大量密钥的 NetHSM 会使 Nginx 的初始加载速度变慢(超过 1 分钟才能加载 1,000 个密钥)。建议使用 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 配置。在此,我们使用带有 PKCS#11 模块的 OpenSSL 引擎,并选择带有标签/ID``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";

例子

如果您想使用`示例<https://github.com/Nitrokey/nethsm-pkcs11/tree/main/container/nginx>`__进行实验,请使用 git 克隆`nethsm-pkcs11 仓库<https://github.com/Nitrokey/nethsm-pkcs11>`__,并运行以下命令:

警告

运行生成脚本会删除``webserver`` 密钥并将其替换。

  1. 配置 NetHSM,可以是一个真正的 NetHSM,也可以是一个容器。更多信息,请参阅`入门指南<getting-started.html>`__。除了管理员,你还需要一个操作员账户。

  2. 下载并安装最新版本的 nethsm-pkcs11 驱动程序`,可从此处获取<https://github.com/Nitrokey/nethsm-pkcs11/releases>`__。

  3. 按照`OpenSSL Manual<openssl.html>`__ 中的说明安装 OpenSSL PKCS11 引擎。无需创建配置文件。

  4. 调整``container/nginx/generate.sh`` 中的变量``HOST``、ADMIN_ACCOUNT 和``ADMIN_ACCOUNT_PWD``,使``HOST`` 中包含 NetHSM 的 URL 和端口,ADMIN_ACCOUNT 中包含管理员账户的用户名,ADMIN_ACCOUNT_PWD 中包含相应的密码。进一步在``OPENSSL_PKCS11_ENGINE_PATH`` 中配置 OpenSSL PKCS11 引擎的绝对路径,在``NETHSM_PKCS11_LIBRARY_PATH`` 中配置 NetHSM PKCS11 库的绝对路径。

  5. 在`的一个已知位置<pkcs11-setup.html#configuration>`__ 中创建 NetHSM PKCS11 配置文件,例如``/etc/nitrokey/p11nethsm.conf``。它必须已配置操作员账户,并使用之前生成脚本中指定的相同 NetHSM 实例。

  6. 在``container/nginx/p11nethsm.conf`` 中用 NetHSMs URL 和有效的操作员凭证更新 PKCS11 配置。

  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/<https://localhost:9443/>`___。请注意,希望您的浏览器会警告您网站证书是自签名的。