我有一个用于生成 RSA key 和签名的硬件。我需要两件事:
1) 生成证书请求。使用硬件,我可以获得证书的公钥并进行签名部分。我需要代码来生成证书,即执行 ASN.1/DER/PEM 操作。
2) 使用 S/MIME 签署数据。同样,我将使用硬件来完成签名部分,但我需要代码来完成格式部分:PKCS#7 来封装签名和上一个任务产生的 x509 证书。
所以我可以使用 openssl 来生成 CSR 和 S/MIME 格式,但是 openssl 需要私钥来签署这样的任务,正如我所说的,我通过硬件进行签名。我知道有一种称为“引擎”的机制可以将硬件功能插入 openssl,但它使用动态库,我的平台(ARM 的早期 uClinux)不支持动态库。
所以问题是:有没有其他方法可以强制 openssl 使用外部公钥,更重要的是,将签名委托(delegate)给我的硬件?否则,您会推荐我可以用来执行此操作的另一个 C/C++ 库吗?我真的不需要加密库,知道如何生成这些格式(证书请求和 S/MIME)的库就足够了。
最佳答案
引擎仍然是您的必经之路,因为它们是使用 OpenSSL 从库本身卸载加密任务的唯一方法。据我了解,您可以构建任何东西,但它必须静态链接到 OpenSSL,因为您无法加载共享库(或构建它们?)。我实际上并不了解 uClinux,所以请耐心等待。
据我所知,加载共享库实际上是通过一个名为dynamic
的引擎完成的,这是一个支持此类加载的特殊引擎。这意味着 OpenSSL 的默认假设是您将在编译时进行链接,并且可以认为该引擎在 OpenSSL 中随时可用。
因此,您要做的是创建一个能够对现有 key 执行加密的引擎,并将其与 OpenSSL 一起构建。例如,尝试原生构建 OpenSSL(无需修改)并运行 openssl engine
。它会很容易地向您展示所有内置引擎(其中一个是 dynamic
,但还有其他引擎,例如用于 nCipher HSM 的 chil
。
大约两年前我遇到了类似的问题(虽然我已经有一个工作引擎)我首先需要创建一个带私钥的 CSR,然后用那个(或不同的)私钥(实际上是 PKCS# 7)。我的解决方案是使用命令行工具生成 key 和 CSR,并且仅将 OpenSSL 用于最重要的加密操作,即签名和解密(我实际上只需要 RSA 签名和解密功能)。
OpenSSL 是一个文档非常糟糕的项目,我必须阅读大量它的源代码才能让想法正常工作。为了让你的引擎启动并运行,我建议你阅读一些引擎的源代码(其中,我使用了 e_capi.c
,我发现它很容易理解)。对于实际的引擎使用,您可能会找到我的一些 sscep源代码很有帮助。
关于引擎的非常好的事情:一旦它们被初始化,它们就会透明地运行,这意味着您初始化一个引擎,从中加载一个 key ,然后您就可以设置:将这个 key 传递给 OpenSSL 加密函数与使用 native 没有什么不同键。
关于c++ - 如何使用带硬件加密芯片的openssl?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21555926/