我使用的是 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 程序对我有用:
/* 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
中定义的。