c++ - 如何使用带硬件加密芯片的openssl?

标签 c++ encryption openssl certificate pkcs#7

我有一个用于生成 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/

相关文章:

c++ - 提升日志记录设置输出级别

c++ - 为什么这个条件返回false,但是在main函数中却返回true?

php - 无法向数据库插入MCRYPT加密数据

c - C 中重复 SSL_connect 导致 SIGSEGV

c - AES 加密 - 大文件

security - 如何仅从 csr 生成证书(公钥)?

c++ - 创建 string_view 元素数组会引发错误 : unable to find string literal operator ‘operator""sv’ with

c++ - CMakeLists.txt :3 (find_package) 处的 CMake 错误

java - 使用什么模式在 Java 中解密来自 iPhone 的 RSA 消息?

java - Java 中的 ECB 和 CBC AES 输出相同