查看源代码 引擎加载

本章描述了在 crypto 应用程序中加载加密引擎的支持。

背景

OpenSSL 公开了一个引擎 API,它使得可以插入 OpenSSL 实现的某些或全部加密操作的替代实现。当配置正确时,OpenSSL 将调用引擎对这些操作的实现,而不是它自己的实现。

通常,OpenSSL 引擎提供特定加密操作的硬件实现。硬件实现通常比其基于软件的对应物提供更高的性能,这被称为加密加速。

注意

引擎动态库的文件名要求可能因 SSL 版本而异。

用例

从默认目录动态加载引擎

如果引擎位于 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">>]