Как сделать TLS 1.3 PSK с помощью openssl? - PullRequest
0 голосов
/ 06 ноября 2019

Я работаю над клиент-серверным программным обеспечением и пытаюсь выяснить, как настроить соединение PSK TLS 1.3 с помощью openssl. По-видимому, существуют разные обратные вызовы по сравнению с TLS 1.2 (и ниже), но документация openssl ужасна, и я не могу понять весь поток.

Может ли кто-нибудь предоставить пример кода о том, как вернуть информацию в этих обратных вызовах?

int SSL_psk_use_session_cb_func(SSL *ssl, const EVP_MD *md,const unsigned char **id,size_t *idlen,SSL_SESSION **sess);   

int (*SSL_psk_find_session_cb_func)(SSL *ssl,const unsigned char *identity,size_t identity_len,SSL_SESSION **sess);
  1. Насколько я понимаю, в TLS1.3 Identity Hint имеет значение NULL, тогда почему эти специфические обратные вызовы TLS1.3 содержат в себе поля идентификации?
  2. Где-то читатьчто TLS 1.3 имеет другой набор наборов шифров, как называются PSK AES256 и PSK CHACHA20
  3. В моем случае сервер будет принимать только одно соединение, то есть канал данных P2P. Мне все еще нужно заставить одну сторону выступать в роли сервера, т.е. использовать find_session_cb вместо use_session_cb?

1 Ответ

2 голосов
/ 06 ноября 2019

Может ли кто-нибудь предоставить пример кода о том, как вернуть информацию в этих обратных вызовах?

Вы можете посмотреть, как s_client делает это здесь:

https://github.com/openssl/openssl/blob/6af1b11848f000c900877f1289a42948d415f21c/apps/s_client.c#L183-L243

А вот как это делает s_server:

https://github.com/openssl/openssl/blob/6af1b11848f000c900877f1289a42948d415f21c/apps/s_server.c#L185-L232

Насколько я понимаю, в TLS1.3 Identity Hint имеет значение NULL, тогда почему этиСпецифичные обратные вызовы TLS1.3 содержат поля идентичности?

Идентификация Подсказка и Идентификация - это две разные вещи. В TLSv1.2 сервер может предоставить клиенту подсказку, чтобы позволить клиенту выбрать правильную идентификационную информацию для этого сервера. В TLSv1.3 PSKs работают совершенно по-другому. Клиент отправляет удостоверение на сервер в самом первом сообщении, поэтому нет никакой возможности получить подсказку. На практике подсказки обычно не так полезны.

В контексте PSK вы можете рассматривать идентичность как нечто вроде имени пользователя (на самом деле это немного упрощение - но этого достаточно для наших целей). здесь)

Где-то читал, что в TLS 1.3 есть другой набор шифров, как называются PSK AES256 и PSK CHACHA20

В TLSv1.2 вам нужноиспользовать специальные шифры PSK. В TLSv1.3 это больше не так. Ciphersuits работают совершенно по-другому, и не существует концепции наличия специальных PSK-шифров. Вы просто используете обычные наборы шифров. Главное, что следует опасаться, это то, что в TLSv1.3 PSK всегда ассоциируется с хэшем (например, SHA256). Какой бы шифр вы ни использовали, он должен быть совместим с этим хешем, например, для SHA256 вы можете использовать TLS_CHACHA20_POLY1305_SHA256 или TLS_AES_128_GCM_SHA256.

В моем случае сервер будет принимать только одно соединение, то есть канал данных P2P. Нужно ли мне заставлять одну сторону действовать как сервер, т.е. использовать find_session_cb вместо use_session_cb?

В TLS клиент определяется как одноранговый узел, который инициирует связь, а сервер является одноранговым узлом, который принимает входящиесоединения. Следовательно, всегда клиент и роль сервера. Итак, да, одна сторона должна использовать find_session_cb, а другая сторона должна использовать use_session_cb.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...