Cómo implementar la Indicación del Nombre del Servidor (SNI)

¿Cómo implementar la Indicación del nombre del servidor (SNI) en OpenSSL en C o C ++?

¿Hay algún ejemplo del mundo real disponible?

En el lado del cliente, usa SSL_set_tlsext_host_name(ssl, servername) antes de iniciar la conexión SSL.

En el lado del servidor, es un poco más complicado:

  • Configure un SSL_CTX() adicional SSL_CTX() para cada certificado diferente;
  • Agregue una callback de servidor a cada SSL_CTX() usando SSL_CTX_set_tlsext_servername_callback() ;
  • En la callback, recupere el nombre de servidor proporcionado por el cliente con SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name) . Calcule el SSL_CTX correcto para ir con ese nombre de host, luego cambie el objeto SSL a ese SSL_CTX con SSL_set_SSL_CTX() .

Los archivos s_client.c y s_server.c en las apps/ directorio de la distribución de origen OpenSSL implementan esta funcionalidad, por lo que son un buen recurso para ver cómo se debe hacer.