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

dem*_*guy 8 openssl hsm x509certificate

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

dav*_*085 8

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

您没有确定您的HSM; 有成千上万的模型具有至少数百个接口,尽管很大一部分(几乎不是全部)使用"标准"(主要是)PKCS#11接口.

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

  1. 如果您的HSM是具有内置引擎的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,以生成专用密钥和/或使用现有的一个上的HSM中,更多或更少的现有方式中的OpenSSL构建数据结构的证书(或CSR),但随后得到X509_[REQ_]sign_ctxEVP_PKEY(多态型-C OpenSSL中的数据结构用于您使用自定义方法设置的各种类型的非对称密钥,这些方法使用您的HSM API(以及HSM上的密钥的某些标识)来进行签名.确保您的程序上的任何许可都与OpenSSL许可证(基本上是BSD广告样式)兼容.


Mat*_*ard 5

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

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