Как реализовать идентификацию имени сервера (SNI) на OpenSSL на C или С++?
Есть ли в мире реальные примеры?
Ответ 1
На стороне клиента вы используете SSL_set_tlsext_host_name(ssl, servername) перед началом соединения SSL.
На стороне сервера это немного сложнее:
Настройте дополнительный SSL_CTX() для каждого другого сертификата;
Добавьте обратный вызов servername к каждому SSL_CTX() с помощью SSL_CTX_set_tlsext_servername_callback();
В обратном вызове введите имя сервера, предоставленное клиентом, с помощью SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name). Выделите правое SSL_CTX, чтобы перейти с этим именем узла, затем переключите объект SSL на SSL_CTX с помощью SSL_set_SSL_CTX().
Файлы s_client.c и s_server.c в каталоге apps/ исходного дистрибутива OpenSSL реализуют эту функцию, поэтому они являются хорошим ресурсом, чтобы увидеть, как это сделать.