OpenSSL 3.0如何获取支持的公钥算法?弃用API替代方案咨询
OpenSSL 3.0 替代EVP_PKEY_meth系列接口获取公钥算法列表的方案
在OpenSSL 3.0中,原有的EVP_PKEY_meth_get_count()、EVP_PKEY_meth_get0()等接口已被弃用,取而代之的是基于Provider架构的新算法遍历体系。你可以使用**EVP_KEYMGMT_do_all_sorted()**来实现类似EVP_CIPHER_do_all_sorted的公钥算法遍历功能。
核心逻辑
OpenSSL 3.0将公钥算法的管理抽象为EVP_KEYMGMT(密钥管理)组件,EVP_KEYMGMT_do_all_sorted()会按名称排序遍历所有已注册的密钥管理算法,每个算法对应一种公钥类型。
代码示例
#include <openssl/evp.h> #include <openssl/core.h> // 遍历回调函数:处理每个公钥算法 static int iterate_pkey_algs(const OSSL_ALGORITHM *alg, void *user_data) { // alg->algorithm_name 为算法名称(如 "RSA", "EC", "ED25519" 等) printf("Supported public key algorithm: %s\n", alg->algorithm_name); return 1; // 返回1继续遍历,返回0终止遍历 } int main(void) { // 遍历所有Provider中的公钥算法(NULL表示使用默认Provider集合) EVP_KEYMGMT_do_all_sorted(NULL, iterate_pkey_algs, NULL); return 0; }
补充说明
- 如果需要限定遍历某个特定Provider的算法,可先加载目标Provider并传入其指针作为第一个参数:
OSSL_PROVIDER *prov = OSSL_PROVIDER_load(NULL, "default"); if (prov != NULL) { EVP_KEYMGMT_do_all_sorted(prov, iterate_pkey_algs, NULL); OSSL_PROVIDER_unload(prov); } OSSL_ALGORITHM结构体的properties字段包含算法属性信息,可用于筛选满足特定条件的算法(如是否支持签名、加密等)。
内容的提问来源于stack exchange,提问作者Nickolay Olshevsky
相关产品推荐
相关产品推荐

