我正在尝试使用OpenSSL 1.1.1获得DTLS“连接”。
尝试在套接字上运行SSL_ERROR_SYSCALL
时,我不断收到DTLSv1_listen()
。
我使用单个AF_INET,DGRAM,UDP套接字来接收所有传入数据。我假设我可以保留它,OpenSSL会在接收到数据报时负责确定发送者,但我开始认为自己是错的。
我有:(为简便起见,省略了错误处理)
SSL_CTX *ctx = SSL_CTX_new(DTLS());
SSL_CTX_use_certificate_file(ctx, "certs/server-cert.pem", SSL_FILETYPE_PEM);
SSL_CTX_use_PrivateKey_file(ctx, "certs/server-key.pem", SSL_FILETYPE_PEM);
SSL_CTX_set_cookie_generate_cb(ctx, generate_cookie);
SSL_CTX_set_cookie_verify_cb(ctx, &verify_cookie);
int fd = socket(AF_INET, SOCK_DGRAM, 0);
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const void*) &on, (socklen_t) sizeof(on));
bind(fd, (const struct sockaddr *) &server_addr, sizeof(struct sockaddr_in))
SSL *ssl = SSL_new(ctx);
SSL_set_fd(ssl, fd);
SSL_set_accept_state(ssl);
while(DTLSv1_listen(ssl, (BIO_ADDR *) BIO_get_conn_address(SSL_get_rbio(ssl))) <= 0)
...
正如我提到的那样,最后一行给了我一个“ SSL_ERROR_SYSCALL”。
errno
给了我0
。
我怀疑我在CTX配置中缺少一些步骤,但是我不确定是什么。
我一直在浏览一些示例,one in particular引起了我的注意。似乎每当它接收到一个数据报并在该套接字上对远程地址执行一个connect()
时,就会创建一个 new 套接字。这对我来说有点荒谬,因为我认为UDP不需要每个客户端AFAIK都具有soket。
答案 0 :(得分:0)
在BSD套接字中,可以在UDP套接字上进行连接,但这 基本上只是设置发送的默认目标地址(而不是 明确给send_to)。
因此成功可能会取决于所使用的send
函数。
通常,您可以使用UDP套接字与许多对等点进行DTLS通信。这需要在“关联密钥/序列号”和另一个对等方的地址之间进行一些映射。尽管这与服务器端几乎相同,但并非不可能。但是,许多TLS派生的实现并未启用此类UDP特定功能,因此您可能被迫使用单独的套接字。
无论如何都会留下一个陷阱: 如果要使用SNI /服务器名称指示)使用来自同一对等方的不同dns名称访问同一台物理服务器,则将失败。