How to implement Server Name Indication(SNI) on OpenSSL in C or C++?
Are there any real world examples available?
Enable SNI feature on the SSL virtual server. Navigate to Traffic Management > Load Balancing > Virtual Servers > Select the virtual server and click Edit >SSL Parameters and check SNI Enable.
Server Name Indication (SNI) is an extension to the TLS protocol. It allows a client or browser to indicate which hostname it is trying to connect to at the start of the TLS handshake. This allows the server to present multiple certificates on the same IP address and port number.
On Windows Server 2012, IIS supports Server Name Indication (SNI), which is a TLS extension to include a virtual domain as a part of SSL negotiation. What this effectively means is that the virtual domain name, or a hostname, can now be used to identify the network end point.
Server Name Indication (SNI) allows the server to safely host multiple TLS Certificates for multiple sites, all under a single IP address. It adds the hostname of the server (website) in the TLS handshake as an extension in the CLIENT HELLO message.
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:
SSL_CTX()
for each different certificate;SSL_CTX()
using SSL_CTX_set_tlsext_servername_callback()
;SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name)
. Figure out the right SSL_CTX
to go with that host name, then switch the SSL
object to that SSL_CTX
with SSL_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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With