Nginx 和 HSM 集成以保存私钥

信息安全 tls openssl nginx hsm
2021-08-24 19:24:40

我们正在使用 Nginx 并将私钥存储在服务器上的文件中。我们希望将我们的私钥移动到 HSM,以便 SSL 密钥存储在 HSM 中并且永远不会离开 HSM。SSL 终止期间所需的所有加密操作都可以在 HSM 上完成。

在 Heartbleed 之后,我们看到很多文章建议使用 HSM,但我们无法找到如何将其启用/添加到 Nginx。我们发现了一个补丁,使引擎 Keyform 能够从引擎中读取私钥。我们不想从支持 PKCS#11 的引擎中读取密钥,而是希望使用 HSM 来执行所有加密操作,以便 SSL 密钥永远不会离开 HSM。

是否有任何现有的 Nginx/OpenSSL 插件/模块/实现可以帮助我们实现这一目标?我看过很多关于使用 HSM 终止 SSL 的文章,但找不到任何实现细节。所以在我开始深入研究 Nginx/OpenSSL 代码之前,我想听听是否有人对这个问题有一些建议或建议。

3个回答

我以前从来没有这样做过。但这里有一些建议性的指针。这些要点并不是让它发挥作用的具体步骤。从新AWS CloudHSM(非经典)产品文档

  1. 使用 CLI 实用程序设置 CloudHSM 并生成私钥
  2. 安装和配置 CloudHSM OpenSSL 库。
  3. 检查引擎是否工作openssl engine -t cloudhsm
  4. 配置 Nginx。从 Nginx 1.7.9 开始,您可以为私钥指定引擎

可以指定值 engine:name:id 代替文件 (1.7.9),该文件从 OpenSSL 引擎名称加载具有指定 id 的密钥。

所以你的 nginx 配置看起来像这样

ssl_certificate_key cloudhsm:<name>:<keyid>;

我不太确定名称或 keyID 是什么。如果我找到一些东西,我会阅读一下并编辑这个答案。

注意:此外,根据文档,如果要启用 SSL 加速(在 HSM 中进行加密),您可能必须将 设置为ssl_enginecloudhsm

ssl_engine cloudhsm;
  1. 测试。

请问您为什么不想使用 AWS ACM 在负载均衡器上卸载 SSL?这是最简单的方法,如果您相信 AWS 是安全的,它就是安全的。


编辑:我读了一点,我或多或少地确定Key HandleCloudHSM 用语 - 6 位数字标识符 - 就在keyid这里。我也认为user namename部分。所以你的 Nginx 配置可能是:

# something that looks like:
ssl_certificate_key cloudhsm:AWSUser:568900;

edit2:不需要 Nginx 编译。我们只需要确保 openssl 引擎是可加载的。配置完成后,验证时如下所示:

[root@ip-172-31-14-127 ~]# export n3fips_password=user_cu:Wzs8sukUp7FkVs4xQU
[root@ip-172-31-14-127 ~]# openssl engine -t cloudhsm
(cloudhsm) CloudHSM hardware engine support
     SDK Version: 2.03
[ available ]

编辑3:好消息!根据这个论坛帖子,亚马逊正在为 Nginx 与 CloudHSM 的集成编写更好的文档。

编辑 4:AWS 已经更新了他们的文档以包含 Apache 和 Nginx 的说明。我似乎有点正确!;) 所以,显然,你下载了一个“假私钥”并在你的 Nginx 配置中使用它。其余的说明都很好。

无论您选择哪种方法,您都可以从 HSM 导出私钥句柄并将其保存到文件中。该文件不包含实际的私钥。它包含对存储在 HSM 上的私钥句柄的引用。该文件的内容被称为伪造的 PEM 格式私钥。您的 Web 服务器软件使用伪造的 PEM 格式私有密钥文件以及用于 OpenSSL 的 AWS CloudHSM 软件库,将 SSL 或 TLS 处理卸载到集群中的 HSM

此处的文档:https ://docs.aws.amazon.com/cloudhsm/latest/userguide/ssl-offload.html

我还没有测试过这个。一旦我这样做,将发布更新。

为了像我一样通过谷歌搜索“cloudhsm nginx”找到这篇文章的其他人的利益:@eternaltyro 的答案几乎是正确的。但不是以cloudhsm:<name>:<keyid>;格式引用密钥 ID,而是使用getCaviumPrivKeyCloudHSM 的key_mgmt_util中的函数将密钥导出为“假”PEM 文件,然后将 nginx 指向该ssl_certificate_key文件。您还应该按照说明设置ssl_enginecloudhsm

当您使用 Safenet(现为金雅拓)Luna HSM SA 7000 时。您可以为密钥管理服务添加一个抽象层。例如 - 金雅拓的 Key Secure Appliance(他们使用虚拟设备)。

KMS 与 HSM 集成。您需要向 HSM 注册密钥管理服务,然后来自 KMS 的每个事务都将使用主密钥包装,该主密钥位于 HSM 上注册的分区之一中。

我从事 HSM 和 KeySecure 但从未终止 SSL。首先,如果您可以尝试使用带有 KMS(带/不带 HSM)的 SSL,我可以帮助您完成其余的集成。