OpenSSL应用程序忽略在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应用程序(例如运行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,不显式指定自己的引擎?)

就像那个页面上说的&注意,这使用了1.1.0[及以上]中的自动初始化功能"默认的libcrypto init不加载标准(或任何)配置;参见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,并且有一个构建(编译时)kludge选项可以让该例程自动调用OPENSSL_config,这非常接近您所要求的。

最新更新