3 引擎负载
3.1 背景
OpenSSL 公开了 Engine API,它允许插入 OpenSSL 实现的某些或所有加密操作的替代实现。在适当配置的情况下,OpenSSL 会调用引擎对这些操作的实现,而不是调用它自己的实现。
通常,OpenSSL 引擎提供特定加密操作的硬件实现。硬件实现通常比其基于软件的对应物提供更高的性能,这被称为加密加速。
注意
引擎动态库上的文件名要求可能因 SSL 版本而异。
3.2 用例
从默认目录动态加载引擎
如果引擎位于 OpenSSL/LibreSSL 安装的 engines 目录中。
1> {ok, Engine} = crypto:engine_load(<<"otp_test_engine">>, [], []). {ok, #Ref}
使用动态引擎加载引擎
通过提供库的路径,使用动态引擎加载引擎。
2> {ok, Engine} = crypto:engine_load(<<"dynamic">>, [{<<"SO_PATH">>, <<"/some/path/otp_test_engine.so">>}, {<<"ID">>, <<"MD5">>}, <<"LOAD">>], []). {ok, #Ref}
加载引擎并替换某些方法
使用动态引擎加载引擎,只替换一些引擎方法。
3> {ok, Engine} = crypto:engine_load(<<"dynamic">>, [{<<"SO_PATH">>, <<"/some/path/otp_test_engine.so">>}, {<<"ID">>, <<"MD5">>}, <<"LOAD">>], []). {ok, #Ref} 4> ok = crypto:engine_register(Engine, [engine_method_digests]). ok
使用确保加载函数加载
此函数确保引擎只加载一次,并且 ID 会添加到 OpenSSL 的内部引擎列表中。对该函数的后续调用会检查 ID 是否已加载,然后只获取引擎的新引用。
5> {ok, Engine} = crypto:ensure_engine_loaded(<<"MD5">>, <<"/some/path/otp_test_engine.so">>). {ok, #Ref}
要从 OpenSSL 引擎列表中删除标签,请使用 crypto:engine_remove/1。
6> crypto:engine_remove(Engine). ok
要卸载它,请使用 crypto:engine_unload/1,它会删除对引擎的引用。
6> crypto:engine_unload(Engine). ok
列出当前加载的所有引擎
8> crypto:engine_list(). [<<"dynamic">>, <<"MD5">>]