How to implement Server Name Indication (SNI)
How to implement Server Name Indication(SNI) on OpenSSL in C or C++?
Are there any real world examples available?
Solution 1:
On the client side, you use SSL_set_tlsext_host_name(ssl, servername)
before initiating the SSL connection.
On the server side, it's a little more complicated:
- Set up an additional
SSL_CTX()
for each different certificate; - Add a servername callback to each
SSL_CTX()
usingSSL_CTX_set_tlsext_servername_callback()
; - In the callback, retrieve the client-supplied servername with
SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name)
. Figure out the rightSSL_CTX
to go with that host name, then switch theSSL
object to thatSSL_CTX
withSSL_set_SSL_CTX()
.
The s_client.c
and s_server.c
files in the apps/
directory of the OpenSSL source distribution implement this functionality, so they're a good resource to see how it should be done.