openssl engine概述(1)
OpenSSL 引擎(Engine)是 OpenSSL 库的一个扩展机制,用于实现加密、解密、签名、验证等操作的定制化实现。引擎可以通过共享库(动态链接库)的方式被加载和使用,从而扩展 OpenSSL 的功能。以下是 OpenSSL 引擎的基本概念:
引擎类型:OpenSSL 引擎可以分为静态引擎和动态引擎。静态引擎是编译到 OpenSSL 库中的,而动态引擎是通过共享库加载的。动态引擎允许在运行时加载和替换,从而更灵活地定制 OpenSSL 功能。
动态加载
openssl动态加载是通过在创建引擎的时候通过下面的预处理命令然后编译成库的形式进行加载
/* 动态加载用这个宏 编译成库 调用ENGINE_load_dynamic();手动加载必须实现加载函数ENGINE_load_my*/
IMPLEMENT_DYNAMIC_CHECK_FN();
IMPLEMENT_DYNAMIC_BIND_FN(bind_helper);
动态加载调用方法
加载 OpenSSL 库:首先,您需要在您的代码中加载 OpenSSL 库。确保您已经正确包含了 OpenSSL 头文件并链接了 OpenSSL 库。
初始化 OpenSSL 引擎系统:在使用引擎之前,需要初始化 OpenSSL 引擎系统。您可以使用 ENGINE_load_builtin_engines() 函数加载内置的引擎,并使用 ENGINE_register_all_complete() 函数注册所有的引擎。
加载特定引擎:使用 ENGINE_by_id() 函数来加载您想要的特定引擎。这个函数会返回一个指向已加载引擎的指针。
使用引擎:一旦引擎加载成功,您可以使用引擎提供的功能。根据您的需求,可以使用引擎来执行加密、解密、签名、验证等操作。
清理引擎和 OpenSSL 引擎系统:在程序结束时,务必释放引擎资源并清理 OpenSSL 引擎系统。
#include <openssl/engine.h>
int main() {
ENGINE *my_engine=NULL;
// 初始化 OpenSSL 引擎系统
ENGINE_load_builtin_engines();
ENGINE_register_all_complete();
// 加载特定引擎
my_engine = ENGINE_by_id("my_engine"); // 替换为您想要加载的引擎 ID
if (my_engine == NULL) {
fprintf(stderr, "Failed to load engine.\n");
ENGINE_cleanup();
return 1;
}
// 使用引擎执行操作
// 释放引擎资源
ENGINE_free(my_engine);
// 清理 OpenSSL 引擎系统
ENGINE_cleanup();
return 0;
}
静态加载
#通过实现load加载函数实现
static ENGINE *engine_my(void)
{
ENGINE *ret = ENGINE_new();
if(!ret)
return NULL;
if(!bind_helper(ret, engine_id))
{
ENGINE_free(ret);
return NULL;
}
return ret;
}
void ENGINE_load_my(void)
{
ENGINE *rsa_st = engine_my();
if(!rsa_st)
return;
ENGINE_add(rsa_st);
ENGINE_free(rsa_st);
ERR_clear_error();
}
静态加载调用
int main(int argc, const char* argv[] ) {
//初始化openssl 算法库
OpenSSL_add_all_algorithms();
ERR_load_crypto_strings();
//手动添加引擎
ENGINE_load_my();
ENGINE *test_engine = ENGINE_by_id("test");
if( test_engine == NULL )
{
printf("Could not Load test Engine!\n");
exit(1);
}
}