对 TLS_server_method 的未定义引用

问题描述 投票:0回答:1

我使用的是 OpenSSL 1.1.1q。当我在 C 应用程序中使用 TLS_server_method() 在 tlsv1.3 上建立 TLS 握手时,出现错误“对 TLS_server_method 的未定义引用”。互联网上的文章说这是为 tlsv1.3 建立 SSL 上下文时必须使用的内容,例如 ssl_server_ctx = SSL_CTX_new(TLS_server_method());

我在 OpenSSL 源代码中没有找到函数或宏的主体 -> TLS_server_method。我可以在 ssl/methods.c 中找到 tlsv1_2_server_method、DTLSv1_2_server_method 等函数的主体,并且使用相同的链接器选项从我的应用程序中找到相同的工作,但不是 TLS_server_method。在构建 OpenSSL 之前,TLS_server_method 是否通过某些配置选项自动生成?有人可以照亮它吗?

c linux security ssl openssl
1个回答
0
投票

这个 C 程序对我有用:

/* ot.c */
#include <openssl/ssl.h>
int main(int argc, char **argv) {
  SSL_CTX *ssl_server_ctx = SSL_CTX_new(TLS_server_method());
  (void)argc; (void)argv;
  return ctx ? 0 : 2;
}

这就是我编译和运行它的方式(没有前导

$
):

$ gcc -s -O2 -W -Wall -Wextra -o ot ot.c -lssl && ./ot && echo OK
OK

如果您收到 undefined reference to TLS_server_method 错误,那么您很可能忘记在

-lssl
命令中指定
gcc
。例如:

$ gcc -s -O2 -W -Wall -Wextra -o ot ot.c
/tmp/cc8tP5JH.o: In function `main':
ot.c:(.text.startup+0x5): undefined reference to `TLS_server_method'
ot.c:(.text.startup+0xd): undefined reference to `SSL_CTX_new'
collect2: error: ld returned 1 exit status

这些方法在我的系统的 OpenSSL 中可用(不一定是 1.1.1q):

$ nm -D /usr/lib/x86_64-linux-gnu/libssl.so | grep _server_method
000000000001fe80 T DTLS_server_method
000000000001ff70 T DTLSv1_2_server_method
000000000001ffa0 T DTLSv1_server_method
000000000001fd90 T TLS_server_method
000000000001ff10 T TLSv1_1_server_method
000000000001fee0 T TLSv1_2_server_method
000000000001ff40 T TLSv1_server_method

我在 OpenSSL 源代码中没有找到函数或宏的主体 -> TLS_server_method

我从官方位置下载了https://ftp.openssl.org/source/old/1.1.1/openssl-1.1.1q.tar.gz并解压了它,然后我进行了搜索对于

TLS_server_method
。在文件中
ssl/methods.c
我发现:

IMPLEMENT_tls_meth_func(TLS_ANY_VERSION, 0, 0, 
                        TLS_server_method,
                        ossl_statem_accept,
                        ssl_undefined_function, TLSv1_2_enc_data)

在文件

ssl/ssl_local.h
中,我发现了

# define IMPLEMENT_tls_meth_func(version, flags, mask, func_name, s_accept, \
                                 s_connect, enc_data) \
const SSL_METHOD *func_name(void)  \

这意味着函数

TLS_server_method
是使用
ssl/methods.c
中定义的宏
IMPLEMENT_tls_meth_func
ssl/ssl_local.h
中定义的。

© www.soinside.com 2019 - 2024. All rights reserved.