OpenSSL 应用程序忽略 openssl.cnf 中指定的默认引擎

OpenSSL application ignores default engine specified in openssl.cnf

我正在尝试配置 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 应用程序(例如当 运行ning openssl s_client -tls1_3 -connect google.com:443 时)和 Nginx。但是,它不适用于其他一些应用程序。例如,我复制了代码 here,它使用 EVP API 来使用 AES-CBC 进行简单的对称加密和解密。我的引擎支持 AES-CBC,所以这应该可以。但是当我构建这个应用程序(使用 gcc -o main main.c -lcrypto -lssl)并 运行 它时,我的引擎没有被调用甚至加载。为什么不?有什么方法可以强制所有 OpenSSL 调用者使用我的引擎 而无需修改 OpenSSL 的代码 ? (或者至少所有动态 link OpenSSL 并且没有明确指定他们自己的引擎的调用者?)

如该页面所述“请注意,这使用 1.1.0 [及更高版本] 中的自动初始化工具”,默认的 libcrypto init 不加载标准(或任何)配置;参见 the man page for OPENSSL_init_crypto。您需要使用 LOAD_CONFIG 标志显式调用,或者调用 OPENSSL_init_ssl,或者调用(第一个)SSL_CTX_new,这通常是合理程序中使用的第一个 libssl 例程,并且隐式执行 OPENSSL_init_ssl.

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

开头

在旧版本(几乎所有)中,程序通常需要(明确地)调用几个初始化例程,具体取决于它们将要做什么,通常包括 OPENSSL_add_all_algorithms, and there was a build (compile-time) kludgeoption to have that routine automatically call OPENSSL_config,这与您的要求非常接近。