【问题标题】:How to use openssl with a hardware encryption chip?如何使用带有硬件加密芯片的openssl?
【发布时间】:2014-02-28 15:00:30
【问题描述】:

我有一个用于生成 RSA 密钥和签名的硬件。我需要两件事:

1) 生成证书请求。使用硬件,我可以获得证书的公钥并进行签名部分。我需要代码来生成证书,即做 ASN.1/DER/PEM 的东西。

2) 使用 S/MIME 对数据进行签名。同样,我将使用硬件来执行签名部分,但我需要代码来执行格式部分:PKCS#7 来封装由上一个任务产生的签名和 x509 证书。

所以我可以同时使用 openssl 来生成 CSR 和 S/MIME 格式,但是 openssl 需要对此类任务使用私钥进行签名,并且正如我所说的那样,我通过硬件进行签名。我知道有一种称为“引擎”的机制可以将硬件功能插入到 openssl,但它使用动态库,我的平台不支持(早期的 uClinux for ARM)。

所以问题是:有没有其他方法可以强制 openssl 获取外部公钥,更重要的是,将签名委托给我的硬件?否则,您会推荐另一个我可以用来执行此操作的 C/C++ 库吗?我真的不需要加密库,只要有一个知道如何生成这些格式(证书请求和 S/MIME)的库就足够了。

【问题讨论】:

    标签: c++ encryption openssl certificate pkcs#7


    【解决方案1】:

    引擎仍然是您要走的路,因为它们是使用 OpenSSL 将加密任务从库本身中卸载的唯一方法。据我了解,您可以构建任何东西,但它必须静态链接到 OpenSSL,因为您无法加载共享库(或构建它们?)。我实际上并不了解 uClinux,所以请多多包涵。

    据我所知,加载共享库实际上是通过一个名为dynamic 的引擎完成的,这是一个支持这种加载的特殊引擎。这意味着 OpenSSL 的默认假设是您将在编译期间进行链接,并且可以认为该引擎在 OpenSSL 中随时可用。

    因此,您要做的是创建一个能够对现有密钥执行加密的引擎,并将其与 OpenSSL 一起构建。例如,尝试原生构建 OpenSSL(无需修改)并运行 openssl engine。它会很容易地向您展示所有内置引擎(其中一个是 dynamic,但还有其他的,例如用于 nCipher HSM 的 chil

    大约两年前我遇到了类似的问题(尽管我已经有一个工作引擎),我首先需要创建一个带有私钥的 CSR,然后使用该(或不同的)私钥(实际上是 PKCS# 7 也一样)。我的解决方案是使用命令行工具生成密钥和 CSR,并且只使用 OpenSSL 进行最重要的加密操作,即签名和解密(我实际上只需要 RSA 签名和解密函数)。

    OpenSSL 是一个可怕的文档项目,我必须阅读大量源代码才能让想法正常工作。为了让您的引擎启动并运行,我建议您阅读一些引擎的源代码(其中,我使用过e_capi.c,我发现它相当容易理解)。对于引擎的实际使用,您可能会发现我的一些sscep 源代码很有帮助。

    引擎的优点:一旦初始化,它们就透明地运行,这意味着您初始化引擎,从中加载一个密钥,然后您就可以设置:将此密钥传递给 OpenSSL 加密函数与使用本机没有什么不同键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-11
      • 2017-11-28
      • 2012-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多