我经常使用openssl生成RSA key 和证书。但是现在我遇到了一个问题。 openssl x509 -req需要私钥作为输入。但是现在我们正在使用HSM保护私钥,而我将永远无法触摸私钥。这样我应该如何生成x509证书?

最佳答案

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

您无法识别您的HSM;有成千上万个具有至少数百个接口(interface)的模型,尽管相当一部分(不是全部)使用“标准”(主要是)PKCS#11接口(interface)。

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

  • 如果您的HSM是带有内置引擎的HSM之一,请根据其文档配置所需的引擎,并在-engine id(sub)命令中使用适当的-*engine idopenssl选项。

  • 请注意,req -new仅使用-x509生成证书,通常会加上一些相关参数,并且以这种方式生成的证书是自签名的;否则,req -new会生成一个证书签名请求(CSR),然后您将获得一个CA,以将其“转换”为CA签名的“真实”证书(PKCS#10 CSR本身始终是自签名的)。 req也可以生成一个新的私钥,而不是使用现有的私钥,并且此生成可以“在”引擎中,从而在HSM上。
  • 如果您的HSM没有内置引擎,但确实有来自另一方的引擎,则将其安装到系统中。 PKCS#11就是这种情况。这可能需要将您的OpenSSL版本更改为引擎支持的版本。然后按照步骤1进行操作:配置引擎并使用它。
  • 如果您的HSM没有任何引擎,但是其API提供了OpenSSL在引擎中想要的操作,则可以为其编写(和调试!)引擎模块。然后使用您的引擎按1中的步骤进行操作。还可以考虑将引擎模块提供给全世界,使用这种HSM类型的社区和/或OpenSSL项目。
  • 如果您的HSM功能不适合引擎API,或者不存在引擎模块,并且您不想创建一个引擎模块,则可以使用openssl/apps/req.c中的一些(也许很多)代码编写自己的程序,在HSM上生成一个私钥和/或使用现有的私钥,或多或少以现有方式在OpenSSL中构建证书(或CSR)的数据结构,然后给X509_[REQ_]sign_ctxEVP_PKEY(C语言中的多态数据结构)在OpenSSL中用于各种类型的非对称 key ),这些类型是通过使用HSM API(以及HSM上的某些 key 标识)进行签名的自定义方法设置的。
    确保您程序上的任何许可都与OpenSSL许可(本质上是BSD广告风格)兼容。
  • 10-07 19:10