2011-02-25 12 views
33

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

¿Hay algún ejemplo del mundo real disponible?

+1

Consulte también [Servir varios dominios en una casilla con SNI] (http://stackoverflow.com/questions/22373332/serving-multiple-domains-in-one-box-with-sni) para algunos ejemplos de código y uso 's_client' para probar su servidor. – jww

Respuesta

50

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, que es un poco más complicado:

  • Configurar una SSL_CTX() adicional para cada certificado diferente;
  • Agregue una devolución de llamada del servidor a cada SSL_CTX() usando SSL_CTX_set_tlsext_servername_callback();
  • En la devolución de llamada, 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 s_client.c y s_server.c archivos en el directorio apps/ de la distribución de la fuente de OpenSSL implementar esta funcionalidad, por lo que son un buen recurso para ver cómo debe hacerse.

+0

s_client.c y s_server.c son buenos ejemplos. Estoy tratando de implementar SNI en un cliente que actúa como generador de carga (red) y martilla un servidor con solicitudes http/https. Y el servidor ya tiene implementada la SNI del servidor. –

+0

¿Las llamadas al servidor se mantienen en un contexto multiproceso? Parece que SSL_set_SSL_CTX no es innatamente seguro (es decir, si tiene dos conexiones de entrada diferentes con dos certs diferentes, tendrá un problema). – chacham15

+0

@ chacham15: una forma de hacerlo seguro para hilos es asignar un 'SSL_CTX()' por certificado, por hilo (y siempre manejar los mismos objetos 'SSL' y' SSL_CTX' del mismo hilo). La otra forma es establecer devoluciones de llamadas de hilo con 'CRYPTO_set_id_callback()' y 'CRYPTO_set_locking_callback()', en cuyo caso OpenSSL realizará las llamadas correctas a la devolución de llamada de bloqueo para hacer 'SSL_set_SSL_CTX() 'thread-safe. – caf

Cuestiones relacionadas