使用OpenSSL 3.0生成RSA密钥时遇链接错误求助
问题描述
参考OpenSSL 3.0官方文档编写了如下代码:
#include <openssl/rsa.h> #include <openssl/evp.h> int main(){ EVP_PKEY*pkey=EVP_RSA_gen(1024); }
使用编译命令:
gcc -I/usr/include/openssl/ rsa2.c -lcrypto -lssl
编译时出现链接错误:
/usr/bin/ld: /tmp/ccLRNWp1.o: in function `main': rsa2.c:(.text+0x28): undefined reference to `EVP_PKEY_Q_keygen' collect2: error: ld returned 1 exit status
使用的OpenSSL版本为OpenSSL 3.0.7 1 Nov 2022,询问遗漏了什么。
解决方法
这个错误的核心原因是:OpenSSL 3.0中EVP_RSA_gen这类简化密钥生成接口依赖内部的provider机制,手动指定-lcrypto -lssl无法链接到provider相关的实现代码。
提供两种可靠的解决方式:
方式一:用pkg-config自动获取编译链接参数
这是最省心的方式,pkg-config会自动读取OpenSSL 3.0的配置文件,输出所有必要的头文件路径和链接库:
gcc rsa2.c -o rsa2 $(pkg-config --cflags --libs libcrypto)
执行这个命令即可完成编译,无需手动指定头文件目录和链接库。
方式二:改用OpenSSL 3.0标准密钥生成API
EVP_RSA_gen属于简化接口,底层依赖隐式加载的provider,改用通用的EVP_PKEY_keygen流程兼容性更强,也能避免此类链接问题:
#include <openssl/evp.h> #include <openssl/params.h> int main() { EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL); EVP_PKEY *pkey = NULL; if (!ctx || EVP_PKEY_keygen_init(ctx) <= 0) { // 可添加错误日志输出 return 1; } // 设置RSA密钥长度为1024 if (EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, 1024) <= 0) { EVP_PKEY_CTX_free(ctx); return 1; } // 生成密钥 if (EVP_PKEY_keygen(ctx, &pkey) <= 0) { EVP_PKEY_CTX_free(ctx); return 1; } // 此处可添加密钥的使用逻辑 // 释放资源 EVP_PKEY_free(pkey); EVP_PKEY_CTX_free(ctx); return 0; }
编译这段代码时,同样可以使用上述pkg-config的命令。
内容的提问来源于stack exchange,提问作者Per Mertesacker
相关产品推荐
相关产品推荐

