Как внедрить индикацию имени сервера (SNI) - PullRequest
37 голосов
/ 25 февраля 2011

Как реализовать Индикацию имени сервера (SNI) на OpenSSL в C или C ++?

Есть ли примеры из реальной жизни?

1 Ответ

56 голосов
/ 25 февраля 2011

На стороне клиента вы используете SSL_set_tlsext_host_name(ssl, servername) перед установкой соединения SSL.

На стороне сервера все немного сложнее:

  • Установите дополнительные SSL_CTX() для каждого отдельного сертификата;
  • Добавить обратный вызов имени сервера для каждого 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 реализуют эту функцию, поэтому они являются хорошим ресурсом, чтобы узнать, как это сделать.

...