You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 10:10:19