C++ 如何将openssl与硬件加密芯片结合使用?

C++ 如何将openssl与硬件加密芯片结合使用?,c++,encryption,openssl,certificate,pkcs#7,C++,Encryption,Openssl,Certificate,Pkcs#7,我有一个用于生成RSA密钥和签名的硬件。我需要两样东西: 1) 生成证书请求。通过硬件,我可以获得证书的公钥并进行签名。我需要代码来生成证书,也就是说,执行ASN.1/DER/PEM之类的操作 2) 使用S/MIME对数据进行签名。同样,我将使用硬件来完成签名部分,但我需要代码来完成格式部分:PKCS#7来封装签名和上一个任务产生的x509证书 所以我可以使用openssl来生成CSR和S/MIME格式,但是openssl需要一个私钥来签名,正如我所说的,签名是通过硬件完成的。我知道有一种称为“

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

1) 生成证书请求。通过硬件,我可以获得证书的公钥并进行签名。我需要代码来生成证书,也就是说,执行ASN.1/DER/PEM之类的操作

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

所以我可以使用openssl来生成CSR和S/MIME格式,但是openssl需要一个私钥来签名,正如我所说的,签名是通过硬件完成的。我知道有一种称为“引擎”的机制可以将硬件功能插入openssl,但它使用动态库,这在我的平台(早期用于ARM的uClinux)上是不受支持的


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

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

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

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

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

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


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

引擎仍然是你要走的路,因为它们是卸载加密函数的唯一方法要求在库本身之外使用OpenSSL。据我所知,您可以构建任何东西,但它必须静态链接到OpenSSL,因为您无法加载共享库(或构建它们?)。我实际上不了解uClinux,所以请在这里耐心听我说

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

因此,您要做的是创建一个能够对现有密钥执行加密的引擎,并将其与OpenSSL一起构建。例如,尝试以本机方式构建OpenSSL(无需修改)并运行
OpenSSL引擎
。它将很容易向您显示所有内置引擎(其中一个是
dynamic
,但对于nCipher HSMs,还有其他的如
chil

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

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

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