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