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`` 密钥并将其替换。
配置 NetHSM,可以是一个真正的 NetHSM,也可以是一个容器。更多信息,请参阅`入门指南<getting-started.html>`__。除了管理员,你还需要一个操作员账户。
下载并安装最新版本的 nethsm-pkcs11 驱动程序`,可从此处获取<https://github.com/Nitrokey/nethsm-pkcs11/releases>`__。
按照`OpenSSL Manual<openssl.html>`__ 中的说明安装 OpenSSL PKCS11 引擎。无需创建配置文件。
调整``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 库的绝对路径。在`的一个已知位置<pkcs11-setup.html#configuration>`__ 中创建 NetHSM PKCS11 配置文件,例如``/etc/nitrokey/p11nethsm.conf``。它必须已配置操作员账户,并使用之前生成脚本中指定的相同 NetHSM 实例。
在``container/nginx/p11nethsm.conf`` 中用 NetHSMs URL 和有效的操作员凭证更新 PKCS11 配置。
生成证书和密钥
./container/nginx/generate.sh
建造集装箱
docker build -f container/nginx/Dockerfile . -t pkcs-nginx
运行容器。
docker run -p 9443:443 -p 9080:80 pkcs-nginx
NGINX 测试页面将在`https://localhost:9443/<https://localhost:9443/>`___。请注意,希望您的浏览器会警告您网站证书是自签名的。