如何在OpenSSL 1.1.1中预操作准备DTLS服务器

时间:2019-07-04 20:05:03

标签: c openssl dtls

我正在尝试使用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。

1 个答案:

答案 0 :(得分:0)

根据connect with UDP

  

在BSD套接字中,可以在UDP套接字上进行连接,但这   基本上只是设置发送的默认目标地址(而不是   明确给send_to)。

因此成功可能会取决于所使用的send函数。

通常,您可以使用UDP套接字与许多对等点进行DTLS通信。这需要在“关联密钥/序列号”和另一个对等方的地址之间进行一些映射。尽管这与服务器端几乎相同,但并非不可能。但是,许多TLS派生的实现并未启用此类UDP特定功能,因此您可能被迫使用单独的套接字。

无论如何都会留下一个陷阱: 如果要使用SNI /服务器名称指示)使用来自同一对等方的不同dns名称访问同一台物理服务器,则将失败。