如何使用openssl与硬件加密芯片?

时间:2014-02-04 15:02:08

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

我有一个用于生成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)就足够了。

1 个答案:

答案 0 :(得分:3)

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

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

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

两年前我遇到过类似的问题(虽然我已经有了一个工作引擎),我首先需要创建一个带私钥的CSR,然后用那个(或不同的)私钥加密(实际上是PKCS# 7以及)。我的解决方案是使用命令行工具生成密钥和CSR,并仅使用OpenSSL进行最重要的加密操作,即签名和解密(实际上我只需要RSA签名和dec功能)。

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

关于引擎的一件非常好的事情:一旦它们被初始化,它们就会透明地运行,这意味着你初始化一个引擎,从中加载一个密钥然后你就设置了:将这个密钥传递给OpenSSLs加密函数与使用本机没什么不同键。