如果私钥在HSM中,如何生成证书?

问题描述 投票:7回答:3

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

openssl x509certificate hsm
3个回答
8
投票

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

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

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

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

请注意,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中的一些(可能很多)代码编写自己的程序来生成私有密钥和/或使用HSM上的现有密钥,在现有方式中或多或少地为OpenSSL中的证书(或CSR)构建数据结构,但随后给X509_[REQ_]sign_ctx一个EVP_PKEY(使用的多态C数据结构)在OpenSSL中,您可以使用自定义方法设置各种类型的非对称密钥,这些方法使用HSM的API(以及HSM上的密钥的某些标识)来进行签名。确保您的程序上的任何许可都与OpenSSL许可证(基本上是BSD广告样式)兼容。

3
投票

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

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


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.