我经常使用openssl
生成RSA密钥和证书。但现在我遇到了一个问题。 openssl x509 -req
需要私钥作为输入。但现在我们正在使用HSM来保护私钥,而我永远无法触及私钥。这样我如何生成x509证书?
我已经看到一些HSM带有他们自己的支持程序,可以用于各种事情,包括密钥生成和证书或CSR创建,或者使它们可用(例如在供应商网站上);你检查了吗?假设这不是一个(好)选项:
您没有确定您的HSM;有数以千计的模型具有至少数百个接口,尽管很大一部分(不是全部)使用“标准”(主要是)PKCS#11接口。
OpenSSL有一个相当开放的ENGINE API,它将一些加密函数子集(如私钥生成,签名和解密)重定向到OpenSSL正常实现之外的实现 - 例如HSM。 OpenSSL内置了一些引擎 - 至少在默认情况下是这样;特定的构建(例如Linux发行版的软件包)可能会省略内置引擎,在这种情况下,您可能需要自己构建。其他人也可以编写引擎模块,包括但不限于特定HSM模型或生产线的制造商或供应商,包括您。
-engine id
(子)命令中使用适当的-*engine id
或openssl
选项。请注意,req -new
仅使用-x509
生成证书,通常加上一些相关参数,并且以这种方式生成的证书是自签名的;否则req -new
会生成证书签名请求(CSR),然后您可以将CA“转换”为CA签名的“真实”证书(PKCS#10 CSR本身始终是自签名的)。 req
也可以生成一个新的私钥,而不是使用现有的私钥,这一代可以在HSM中“引入”引擎。
openssl/apps/req.c
中的一些(可能很多)代码编写自己的程序来生成私有密钥和/或使用HSM上的现有密钥,在现有方式中或多或少地为OpenSSL中的证书(或CSR)构建数据结构,但随后给X509_[REQ_]sign_ctx
一个EVP_PKEY
(使用的多态C数据结构)在OpenSSL中,您可以使用自定义方法设置各种类型的非对称密钥,这些方法使用HSM的API(以及HSM上的密钥的某些标识)来进行签名。确保您的程序上的任何许可都与OpenSSL许可证(基本上是BSD广告样式)兼容。大多数HSM都有PKCS#11驱动程序。您可以使用OpenSC的engine_pkcs11来使OpenSSL能够利用HSM(或智能卡)。有关如何使用它来创建请求的document。
您需要安装和配置PKCS#11中间件(驱动程序),编译engine_pkcs11模块,并且可能需要对上述说明进行一些调整。
使用HSM支持的函数(通常是HSM提供程序支持并提供所需的库),如encrypt()
,decrypt()
,sign()
,以获取所需的数据。您无法从HSM获取私钥对象,也无法将openssl
用于HSM。