问题描述
我有一个应用程序,它与 OpenSSL 1.0.2 和 TPM 硬件以及针对 RSA 的 OpenSSL ENGINE 实现动态链接。
我使用 OpenSSL 的 动态 ENGINE 来注册 TPM ENGINE。这是(简化的)代码的样子:
ENGINE_load_dynamic();
ENGINE *e = ENGINE_by_id("dynamic");
ENGINE_ctrl_cmd_string(e,"SO_PATH",path_to_libtpm,0);
ENGINE_ctrl_cmd_string(e,"ID","tpm2tss","LOAD",NULL,0);
ENGINE_init(e);
ENGINE_ctrl_cmd(e,...);
ENGINE_ctrl_cmd(e,...);
ENGINE_register_all_complete();
ENGINE_finish(e);
ENGINE_free(e);
根据 man page,由于我调用的是 ENGINE_register_all_complete()
而不是 ENGINE_set_default_RSA
,因此我让 OpenSSL 决定使用哪种 RSA 实现。
下次 OpenSSL 尝试设置 RSA 密钥时,任何实现 RSA_METHOD 的捆绑引擎都将传递给 ENGINE_init(),如果其中任何一个成功,该引擎将被设置为 RSA 使用的默认值,从那时起
OpenSSL 是否会优先考虑已注册 ENGINE 中的 RSA 实现而不是它自己的实现?
如果注册了多个 ENGINE 来提供相同算法的实现,会发生什么? OpenSSL 会使用它能够初始化的第一个 ENGINE 吗?
如果没有调用 ENGINE_set_default_XXX
,是否可以保证使用注册的 ENGINE?
解决方法
您可以通过 openssl.cnf
配置文件指定要使用的引擎
或者,您可以使用 -engine
参数在命令行上指定引擎。
从您的 C 代码中,您可以使用 ENGINE_by_id(engine_id);