您必须先加载引擎。我认为最好的方法是动态加载它(否则你需要将它与 openssl 一起编译):
ENGINE_load_dynamic();
ENGINE *your_engine = ENGINE_by_id("dynamic");
...
if (!ENGINE_ctrl_cmd_string(your_engine, "SO_PATH", "path to your engine here (*.so or *.dll), 0))
{
// your error handler
}
if (!ENGINE_ctrl_cmd_string(your_engine, "LIST_ADD", "1", 0))
{
// your error handler
}
if (!ENGINE_ctrl_cmd_string(your_engine, "LOAD", NULL, 0))
{
// your error handler
}
if (!ENGINE_init(your_engine))
{
// your error handler
}
// You can load your private keys this way:
if (!(pk = ENGINE_load_private_key(your_engine, "probably your password...", NULL, NULL)))
{
}
// You need to tell OpenSSL that you want to use your Engine, for RSA stuff, for example you may do like this
ENGINE_set_default_RSA(your_engine);
...
但是,要生成密钥,我不知道是否可以仅使用 OpenSSL 本机接口。对于我的项目,我创建了一个自定义命令。因此,在引擎内部的 ENGINE_CMD_DEFN 中,我添加了以下内容:
static const ENGINE_CMD_DEFN md_defns[] = {
...
{CMD_GEN_KEYPAIR, "CMD_GEN_KEYPAIR", "Used to generate a key pair", ENGINE_CMD_FLAG_STRING}
...
};
然后,您必须在重载的 ctrl_function (您使用ENGINE_set_ctrl_function(...)
.
要从您的应用程序调用此命令,请使用ENGINE_ctrl_cmd("CMD_GEN_KEYPAIR", 1, (void *)(&adittionalInfo));
,在附加信息中输入足够的信息以生成您的密钥。在我的例子中,我创建了一个类似于 C 结构的钩子,我的应用程序和我的引擎都知道它,以便我的引擎可以盲目地将它转换为正确的类型。
生成密钥后,使用ENGINE_load_private_key
.
我不知道这是否是“最佳”方式,但适合我的需要。