¿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?
¿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?
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:
SSL_CTX()
adicional para cada certificado diferente;SSL_CTX()
usando SSL_CTX_set_tlsext_servername_callback()
;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.
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. –
¿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
@ 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
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