3  引擎负载

3  引擎负载

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

OpenSSL 公开了 Engine 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">>]