0

我正在尝试配置 OpenSSL,以便我设备上的所有 OpenSSL 应用程序都使用自定义引擎。我的 openssl.cnf 文件中有以下内容:

config_diagnostics = 1
openssl_conf = openssl_def

[ openssl_def ]
engines = engine_section

[ engine_section ]
symcrypt = symcrypt_section

[ symcrypt_section ]
engine_id = symcrypt
dynamic_path = /usr/lib/x86_64-linux-gnu/engines-1.1/libsymcryptengine.so
default_algorithms = ALL
init = 1

这适用于 OpenSSL 应用程序(例如运行时openssl s_client -tls1_3 -connect google.com:443)和 Nginx。但是,它不适用于其他一些应用程序。例如,我在这里复制了代码,它使用 EVP API 使用 AES-CBC 进行简单的对称加密和解密。我的引擎支持 AES-CBC,所以这应该可以工作。但是当我构建这个应用程序(使用gcc -o main main.c -lcrypto -lssl)并运行它时,我的引擎没有被调用甚至加载。为什么不?有什么办法可以强制所有调用 OpenSSL的人在不修改 OpenSSL 代码的情况下使用我的引擎?(或者至少所有动态链接 OpenSSL 并且没有明确指定自己的引擎的调用者?)

4

1 回答 1

1

正如该页面所说“请注意,这使用了 1.1.0 [及以上] 中的自动初始化工具”,并且默认的 libcrypto init 不会加载标准(或任何)配置;请参阅手册页OPENSSL_init_crypto。您需要使用 LOAD_CONFIG 标志显式调用OPENSSL_init_ssl,或者 call 或 call (first) SSL_CTX_new,这通常是明智程序中使用的第一个 libssl 例程,并且隐式调用OPENSSL_init_ssl.

openssl命令行(在 1.1.0 以上)可以OPENSSL_init_ssl;我不知道 nginx,但如果不是,它几乎肯定以SSL_CTX_new.

在旧版本(几乎所有)中,程序通常需要(显式)调用几个初始化例程,具体取决于它们要做什么,通常包括OPENSSL_add_all_algorithms,并且有一个构建(编译时)kludge选项可以让该例程自动调用OPENSSL_config,非常接近您的要求。

于 2021-08-20T03:56:19.453 回答