我经常使用openssl
生成RSA key 和证书。但是现在我遇到了一个问题。 openssl x509 -req
需要私钥作为输入。但是现在我们正在使用HSM保护私钥,而我将永远无法触摸私钥。这样我应该如何生成x509证书?
最佳答案
我已经看到一些HSM附带了自己的支持程序,这些程序可用于各种事情,包括 key 生成,证书或CSR创建,或使其可用(例如,在供应商网站上);你检查了吗?
假设这不是一个(好的)选项:
您无法识别您的HSM;有成千上万个具有至少数百个接口(interface)的模型,尽管相当一部分(不是全部)使用“标准”(主要是)PKCS#11接口(interface)。
OpenSSL具有相当开放的ENGINE API,它将密码功能的某些子集(例如私钥生成,签名和解密)重定向到OpenSSL正常实现之外的其他实现(例如HSM)。
OpenSSL内置了一些引擎-至少默认情况下;特定的构建(例如Linux发行版的软件包)可能会省略内置引擎,在这种情况下,您可能需要自己进行构建。其他人也可以编写引擎模块,包括但不限于特定HSM模型或生产线的制造商或供应商,包括您在内。
-engine id
(sub)命令中使用适当的-*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中用于各种类型的非对称 key ),这些类型是通过使用HSM API(以及HSM上的某些 key 标识)进行签名的自定义方法设置的。确保您程序上的任何许可都与OpenSSL许可(本质上是BSD广告风格)兼容。