gpt4 book ai didi

c - 如何从 OpenSSL BIO 对象获取对等地址

转载 作者:太空宇宙 更新时间:2023-11-04 02:10:59 24 4
gpt4 key购买 nike

我正在使用 OpenSSL 1.0.0 库对 TLS 服务器进行编程,因此我使用的是 BIO* 对象,而不是 SSL* 对象(我使用的是 IBM 文档:part 1part 2part 3) .

为了获取到远程客户端的套接字,我运行以下代码:

BIO *new_client;

while(1)
{
if (BIO_do_accept(socket) <= 0)
{ handle error }
new_client = BIO_pop(socket);
BIO_do_handshake(new_client);

// fire a thread and do rest of communication
}

这没有问题,我可以向客户端发送数据,客户端可以响应。如果我不向客户端提供我的自定义 CA 证书文件,客户端会因为证书验证失败等原因拒绝连接。简而言之,一切看起来都很好。

问题是,我无法获得对等主机地址。

我找不到任何特定于 OpenSSL 的 API 来执行此操作。然后我尝试获取套接字的文件描述符并使用以下代码调用 getpeername():

// get peer address
int sock_fd;
if (BIO_get_fd(socket, &sock_fd) == -1)
{
fprintf(stderr, "Uninitialized socket passed to worker");
goto listen_cleanup;
}
printf("socket fd: %i\n", sock_fd);
struct sockaddr addr;
socklen_t addr_len;
// make enough space for ipv6 address and few extra chars
ctx->hostname = malloc(sizeof(char) * 80);
if (!ctx->hostname)
{
fprintf(stderr, "Out of memory\n");
goto internal_error;
}

// ignore failures, as any problem will be caught in TLS handshake
getpeername(sock_fd, &addr, &addr_len);
if (addr.sa_family == AF_INET)
inet_ntop(AF_INET, &((struct sockaddr_in *)&addr)->sin_addr,
ctx->hostname, 40);
else if (addr.sa_family == AF_INET6)
inet_ntop(AF_INET6, &((struct sockaddr_in6 *)&addr)->sin6_addr,
ctx->hostname, 40);
else
{
fprintf(stderr, "Unknown socket type passed to worker(): %i\n",
addr.sa_family);
goto internal_error;
}

但在 BIO_do_handshake() 前后,检查 sa_family 时失败,我得到 Unknown socket type passed to worker(): 50576.

如何在使用包装 TLS 的 OpenSSL BIO 对象时获取对等地址?

最佳答案

原型(prototype)是:

int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen)

addrlen 参数实际上是一个输入/输出参数,这就是您的问题所在。您需要将其初始化为 sockaddr 参数的字节大小,即

addr_len = sizeof(addr);  // this is what's missing
getpeername(sock_fd, &addr, &addr_len);

然后 getpeername 函数将要写入 addr 的字节数存储在 addr_len 中。

在您的辩护中,文档在这一点上可能不清楚。当我在谷歌上搜索 getpeername 时,最上面的条目是 this one .在我看来,它未能充分解释 address_len 论点。 next entry , 然而,一切都清楚了。

关于c - 如何从 OpenSSL BIO 对象获取对等地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14157187/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com