openssl无法使ENGINE_by_id()工作

时间:2014-04-07 09:07:36

标签: c openssl

我正在尝试为Openssl开发自己的动态引擎。

首先,我将通过加载其中一个引擎来了解openssl。

我安装了openssl-1.0.1f。

如此配置:

./config -shared --prefix=/home/user/work/openssl --openssldir=/home/user/work/openssl no-asm -fPIC

并且正在做:

make and make install

在此之后我使用以下方法测试了引擎:

./openssl engine -vvvv dynamic -pre SO_PATH:../lib/engines/libgost.so -pre ID:gost -pre LOAD
(dynamic) Dynamic engine loading support
[Success]: SO_PATH:../lib/engines/libgost.so
[Success]: ID:gost
[Success]: LOAD
Loaded: (gost) Reference implementation of GOST engine
 CRYPT_PARAMS: OID of default GOST 28147-89 parameters
      (input flags): STRING

这似乎没问题。

现在我尝试在一个非常简单的c程序中加载引擎,但是我无法让ENGINE_by_id返回除NULL之外的任何东西。我已经尝试了所有可以想到的东西,但我完全陷入困境。

以下是我的代码:

#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#include <openssl/evp.h>
#include <openssl/engine.h>
#include <stdio.h>
#include <string.h>

int main() {

    ENGINE_load_dynamic();
    ENGINE *eng = ENGINE_by_id("dynamic");

    printf("Error: %s\n", ERR_reason_error_string(ERR_get_error()));

    ENGINE_ctrl_cmd_string(eng, "SO_PATH", "/home/user/work/openssl/lib/engines/libgost.so", 0);
    ENGINE_ctrl_cmd_string(eng, "ID", "gost", 0);
    ENGINE_ctrl_cmd_string(eng, "LOAD", NULL, 0);
    ENGINE_ctrl_cmd_string(eng, "CMD_FOO", "some input data", 0);

    if(NULL == eng) {
        printf("Error: %s\n", ERR_reason_error_string(ERR_get_error()));
        abort(); // failed
    }

    return 0;
}

构建为:

gcc test.c -o test -I/home/user/work/openssl/include -L/home/user/work/openssl/lib -L/home/user/work/openssl/lib/engines -lcrypto -lssl -lgost

输出:

./test
Error: (null)

我做错了什么?

2 个答案:

答案 0 :(得分:0)

因为您将应用程序与本地库链接,所以在运行时请不要忘记导出LD_LIBRARY_PATH或以内联方式使用它。

LD_LIBRARY_PATH=/home/user/work/openssl/lib:/home/user/work/openssl/lib/engines ./test

答案 1 :(得分:0)

我做了以下事情,事情对我有用

  • 创建一个my_engine.so文件并将my_engine.so链接到应用Create a basic engine
  • 在应用程序中编写try_load_engine函数参考(openssl / apps / apps.c)openssl git
  • 导出OPENSSL_ENGINES = my_engine.so的路径