Как предварительно подготовить сервер DTLS в OpenSSL 1.1.1 - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь установить DTLS-соединение с использованием OpenSSL 1.1.1.

Я постоянно получаю 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, но я не уверен, что.

Я просматривал несколько примеров, и один из них привлек мое внимание. Кажется, создается новый сокет всякий раз, когда он получает дейтаграмму и делает connect() на этом сокете с удаленным адресом. Мне это кажется немного нелепым, поскольку я не думаю, что UDP требует сокета для каждого клиента AFAIK.

1 Ответ

0 голосов
/ 06 июля 2019

В соответствии соединение с UDP

В сокетах BSD можно выполнить соединение через сокет UDP, но это в основном просто устанавливает адрес назначения по умолчанию для отправки (вместо этого явноto send_to).

Таким образом, успех может зависеть от используемой функции send.

Обычно вы можете использовать UDP-сокет для связи DTLS со многими узлами.Это требует некоторого сопоставления между «ключами / последовательными номерами ассоциации» и адресом другого партнера.Хотя это почти так же, как на стороне сервера, это не должно быть невозможным.Тем не менее, многие реализации, основанные на TLS, не включают такие специфические функции UDP, и поэтому вы можете быть вынуждены использовать отдельные сокеты.

В любом случае останется одна ловушка: если вы хотите использовать SNI / имя сервераИндикация), чтобы получить доступ к одному и тому же физическому серверу, используя разные имена DNS от одного и того же узла, то у вас не получится.

...