12

我经常openssl用来生成 RSA 密钥和证书。但是现在我遇到了一个问题。openssl x509 -req需要私钥作为输入。但是现在我们使用 HSM 来保护私钥,我永远无法触摸私钥。这样我怎么想生成一个 x509 证书?

4

3 回答 3

10

我已经看到一些HSM 带有自己的支持程序,可用于各种事情,包括密钥生成和证书或 CSR 创建,或使它们可用(例如在供应商网站上);你检查了吗?假设这不是一个(好的)选择:

您没有识别您的 HSM;有数千个模型至少有数百个接口,尽管很大一部分(不是几乎全部)使用“标准”(主要是)PKCS#11接口。

OpenSSL 有一个相当开放的ENGINE API,它可以将加密功能的一些子集(例如私钥生成、签名和解密)重定向到 OpenSSL 正常实现之外的实现(例如 HSM)。OpenSSL 内置了一些引擎——至少在默认情况下是这样;特定的构建(例如 Linux 发行版的包)可能会省略内置引擎,在这种情况下,您可能需要自己构建。其他人也可以编写引擎模块,包括但不限于特定 HSM 型号或生产线的制造商或供应商,包括您。

  1. 如果您的 HSM 是具有内置引擎的引擎之一,请根据其文档根据需要配置该引擎,并为您的(子)命令使用适当的-engine id-*engine id选项。openssl

请注意,req -new仅使用 生成证书-x509,通常加上一些相关参数,并且以这种方式生成的证书是自签名的;否则会req -new生成证书签名请求 (CSR),然后您可以让 CA “转换”为 CA 签名的“真实”证书(PKCS#10 CSR 本身始终是自签名的)。req还可以生成一个新的私钥而不是使用现有的私钥,并且这一代可以“在”引擎中,因此在 HSM 上。

  1. 如果您的 HSM 没有内置引擎,但有来自其他方的引擎,请将其安装到您的系统中。PKCS#11 就是这种情况。这可能需要将您的 OpenSSL 版本更改为引擎支持的版本。然后按照 1 进行操作:配置引擎并使用它。

  2. 如果您的 HSM 没有任何引擎,但其 API 提供了 OpenSSL 在引擎中所需的操作,您可以为它编写(和调试!)一个引擎模块。然后按照 1 使用您的引擎进行操作。还可以考虑向全世界、使用这种 HSM 的社区和/或 OpenSSL 项目提供您的引擎模块。

  3. 如果您的 HSM 的功能不适合引擎 API,或者不存在引擎模块并且您不想创建一个,您可以改为编写自己的程序,使用来自 的一些(可能很多)代码openssl/apps/req.c来生成一个privatekey 和/或使用HSM 上的现有密钥,以或多或少现有的方式在 OpenSSL 中构建证书(或 CSR)的数据结构,然后给出X509_[REQ_]sign_ctx一个EVP_PKEY(用于 OpenSSL 的多态 C 数据结构您使用 HSM 的 API(以及 HSM 上的一些密钥标识)进行签名的自定义方法设置的各种类型的非对称密钥) 。确保您的程序上的任何许可都与 OpenSSL 许可(本质上是 BSD 广告风格)兼容。

于 2015-06-18T11:52:18.323 回答
5

大多数 HSM 都有 PKCS#11 驱动程序。您可以使用 OpenSC 的engine_pkcs11来启用 OpenSSL 以利用 HSM(或智能卡)。有一个关于如何使用它来创建请求的文档。

您需要安装和配置 PKCS#11 中间件(驱动程序),编译 engine_pkcs11 模块,并且可能需要对上述说明进行一些修改。

于 2015-06-18T21:38:15.673 回答
-2

使用 HSM 支持的函数(通常是 HSM 提供程序支持并提供所需的库),如encrypt()decrypt()sign()来获取所需的数据。您无法从 HSM 获取私钥对象,也无法openssl用于 HSM。

于 2015-06-18T09:03:10.927 回答