Server Name Indication
Server Name Indication (SNI) is an extension to the TLS protocol[1] that indicates what hostname the client is attempting to connect to at the start of the handshaking process. This allows a server to present multiple certificates on the same IP address and port number and hence allows multiple secure (HTTPS) websites (or any other Service over TLS) to be served off the same IP address without requiring all those sites to use the same certificate. It is the conceptual equivalent to HTTP/1.1 virtual hosting for HTTPS.
To make use of SNI practical, it is necessary that the vast majority of users use web browsers that support it. Users whose browsers do not support SNI will be presented with a default certificate and hence are likely to receive certificate warnings, unless the server is equipped with a wildcard certificate that matches the name of the website. As of November 2012, the only major user bases whose browsers do not support SNI appear to be users of Android 2.x (default browser), Internet Explorer on Windows XP and versions of Java before 1.7 on any operating system.
Background of the problem
When making a TLS connection the client requests a digital certificate from the web server; once the server sends the certificate, the client examines it and compares the name it was trying to connect to with the name(s) included in the certificate. If a match is found the connection proceeds as normal. If a match is not found the user may be warned of the discrepancy and the connection may be aborted as the mismatch may indicate an attempted man-in-the-middle attack. However, some applications allow the user to bypass the warning to proceed with the connection, with the user taking on the responsibility of trusting the certificate and, by extension, the connection.
It is possible for one certificate to cover multiple hostnames. The X.509 v3 specification introduced the subjectAltName field which allows one certificate to specify more than one domain and the usage of wildcards in both the common name and subjectAltName fields. However it may be impractical -or even impossible, due to lack of a full list of all names in advance- to obtain a single certificate that covers all names a server will be responsible for. As such a server that is responsible for multiple hostnames is likely to need to present a different certificate for each name (or small group of names). Since 2005, CAcert has run experiments on different methods of using TLS on virtual servers.[2] Most of the experiments are unsatisfactory and impractical. For example, it is possible to use subjectAltName to contain multiple domains controlled by one person[3] in a single certificate. Such "unified communications certificates" must be reissued every time the list of domains changes.
Name-based virtual hosting allows multiple DNS hostnames to be hosted by a single server (usually a web server) on the same IP address. To achieve this the server uses a hostname presented by the client as part of the protocol (for HTTP the name is presented in the host header). However when using HTTPS the TLS handshake happens before the server sees any HTTP headers. Therefore it is not possible for the server to use the information in the HTTP host header to decide which certificate to present and as such only names covered by the same certificate can be served from the same IP address.
In practice, this means that an HTTPS server can only serve one domain (or small group of domains) per IP address for secured browsing. Assigning a separate IP address for each site increases the cost of hosting since requests for IP addresses must be justified to the regional internet registry and IPv4 addresses are now in short supply. The result is that many websites are effectively prevented from using secure communications.
How SNI fixes the problem
An extension to TLS called Server Name Indication (SNI) addresses this issue by sending the name of the virtual domain as part of the TLS negotiation.[4] This enables the server to select the correct virtual domain early and present the browser with the certificate containing the correct name. Therefore with clients and servers that support SNI, a single IP address can be used to serve a group of domain names for which it is impractical to get a common certificate.
SNI was added to the IETF's Internet RFCs in June 2003 through RFC 3546, Transport Layer Security (TLS) Extensions. The latest version of the standard is RFC 6066.
Support
In 2004, a patch for adding TLS/SNI into OpenSSL was created by the EdelKey project.[5] In 2006, this patch was then ported to the development branch of OpenSSL, and in 2007 it was back-ported to OpenSSL 0.9.8.
To support SNI the TLS library used by an application must support it and the application must pass the hostname to the TLS library. Further complicating matters the TLS library may be either shipped as part of the application or may be a component of the operating system. As a result of this some browsers support SNI on all operating systems while others only support it on a subset of operating systems. As of 2011 most web browsers and TLS libraries have implemented support for SNI but there are still a large number of users still using combinations of browser and operating system that do not support it.[citation needed]
Browsers with support for TLS server name indication[6]
- Internet Explorer 7 or later, on Windows Vista or higher. Does not work on Windows XP, even Internet Explorer 8 (because the support of this feature is not browser version dependent, it depends on SChannel system component which introduced the support of TLS SNI extension, starting from Windows Vista, not XP).[7]
- Mozilla Firefox 2.0 or later
- Opera 8.0 (2005) or later (the TLS 1.1 protocol must be enabled)[8]
- Opera Mobile at least version 10.1 beta on Android [citation needed]
- Google Chrome (Vista or higher. XP on Chrome 6 or newer.[9] OS X 10.5.7 or higher on Chrome 5.0.342.1 or newer)
- Safari 3.0 or later (Mac OS X 10.5.6 or higher and Windows Vista or higher)
- Konqueror/KDE 4.7 or later [10]
- MobileSafari in Apple iOS 4.0 or later[11]
- Android default browser on Honeycomb (v3.x) or newer[12]
- BlackBerry 10 and BlackBerry Tablet OS default browser
- Windows Phone 7 or later [citation needed]
- MicroB on Maemo
- Odyssey on MorphOS
Servers
- Apache 2.2.12 or later using mod_ssl[13][14][15] (or alternatively with experimental mod_gnutls[16])
- Microsoft Internet Information Server IIS 8[17]
- Nginx with an accompanying OpenSSL built with SNI support
- Apache Traffic Server 3.2.0 or later.
- Cherokee if compiled with TLS support
- Versions of lighttpd 1.4.x and 1.5.x with patch,[18] or 1.4.24+ without patch[19]
- F5 Networks Local Traffic Manager running version 11.1 or later [20]
- Hiawatha (web server) 8.6 or later
- LiteSpeed 4.1 or later
- Pound 2.6 or later[21]
- Apache Tomcat on Java 7 or later
- PageKite[22] tunneling reverse proxy[23]
- Saetta Web Server[24] via OpenSSL
- Citrix NetScaler 9.2 or later (9.3 Enhanced)[25]
- Radware Alteon ADC running AlteonOS 28.1 or later [26]
- HAProxy 1.5 or later [27]
Libraries
- Mozilla NSS 3.11.1[28] client-side only
- OpenSSL
- 0.9.8f (released 11 Oct 2007) - not compiled in by default, can be compiled in with config option '--enable-tlsext'.
- 0.9.8j (released 07 Jan 2009) through 1.0.0 (released 29 March 2010) - compiled in by default
- GnuTLS[29]
- CyaSSL - not compiled in by default, can be compiled in with config option '--enable-sni' or '--enable-tlsx'.[30]
- PolarSSL since 1.2.0 - compiled in by default
- libcurl / cURL since 7.18.1 (released 30 Mar 2008) when compiled against an SSL/TLS toolkit with SNI support
- Python 3.2 (
ssl
,urllib[2]
andhttplib
modules) [31] - Qt 4.8[32]
- Oracle Java 7 JSSE [33]
- Apache HttpComponents 4.3.2 [34]
- wget 1.14[35]
- Android 2.3 (Gingerbread) has partial support if application uses HttpsURLConnection class.[36]
- Android 3.0 (Honeycomb) has full support[37]
- IO::Socket::SSL (Perl/CPAN module, since version 1.83 [38])
- Pike 7.9.5 (SSL module) [39]
No support
The following combinations do not support SNI:
Client side
- Internet Explorer (any version) on Windows XP or Internet Explorer 6 or earlier
- Safari on Windows XP
- BlackBerry OS 7.1 or earlier
- Windows Mobile up to 6.5[40]
- Android default browser on Android 2.x[41] (Fixed in Honeycomb for tablets and Ice Cream Sandwich for phones)
- wget before 1.14
- Nokia Browser for Symbian at least on Series60
- Opera Mobile for Symbian at least on Series60
Server side
Libraries
References
- ↑ "Server Name Indication". Transport Layer Security (TLS) Extensions. p. 8. sec. 3.1. RFC 3546. https://tools.ietf.org/html/rfc3546#section-3.1.
- ↑ "CAcert VHostTaskForce". CAcert Wik.
- ↑ "What is a Multiple Domain (UCC) SSL Certificate?".
- ↑ "TLS Server Name Indication". Paul's Journal.
- ↑ "EdelKey Project".
- ↑ Brand, Kaspar (2009-03-29). "TLS SNI Test Site".
- ↑ http://blogs.msdn.com/b/ieinternals/archive/2009/12/07/certificate-name-mismatch-warnings-and-server-name-indication.aspx
- ↑ Opera (2005-02-25). "Changelog for Opera [8] Beta 2 for Windows" (via Archive.org). Opera Changelogs for Windows. Opera.com. Archived from the original on 2005-11-23. "Readded experimental support for TLS Extensions and TLS 1.1. Setting is disabled by default."
- ↑ "Google Chrome, Issue 43142, Use SSLClientSocketNSS on Windows by default". 2010-10-29 - Although many report Chrome 8 does not work with SNI on XP and Win7.
- ↑ "Bug 122433: Server Name Identification support". Bugs.kde.org. Retrieved 2011-07-18.
- ↑ Kehrer, Paul. "SNI in iOS 4.0". Retrieved 22 November 2010.
- ↑ "Issue 12908 - android Https - websites that support Server Name Indication (SNI) don't work". code.google.com. Retrieved 23 August 2011.
- ↑ "Bug 34607: Support for Server Name Indication". Apache Software Foundation.
- ↑ "Revision 776281: adding support for Server Name Indication to the Apache 2.2.x branch". Apache Software Foundation.
- ↑ "CHANGES: Server Name Indication support is listed under the changes for Apache 2.2.12". Apache Software Foundation.
- ↑ Notaras, George (2007-08-10). "SSL-enabled Name-based Apache Virtual Hosts with mod_gnutls".
- ↑ "What’s New in IIS 8". weblogs.asp.net. Retrieved 2012-04-01.
- ↑ "#386 (TLS servername extension (SNI) for namebased TLS-vhosts)". Trac.lighttpd.net. Retrieved 2011-03-08.
- ↑ "1.4.24 - now with TLS SNI and money back guarantee". Blog.lighttpd.net. Retrieved 2011-03-08.
- ↑ "sol13452: Configuring a virtual server to serve multiple HTTPS sites using TLS Server Name Indication (SNI) feature". ask.f5.com. Retrieved 2012-03-26.
- ↑ "Apsis Gmbh". apsis.ch. Retrieved 2011-08-18.
- ↑ "Open Source PageKite". PageKite.net. Retrieved 2012-04-18.
- ↑ "SSL/TLS back-ends, endpoints and SNI". PageKite.net. Retrieved 2012-04-18.
- ↑ Features of Saetta web server
- ↑ "Configuring an SSL Virtual Server for Secure Hosting of Multiple Sites". Citrix. Retrieved 5 July 2012.
- ↑ "Introducing AlteonOS 28.1! - Knowledge Base - Radware". kb.radware.com. Retrieved 2012-08-20.
- ↑ "HAProxy - The Reliable, High Performance TCP/HTTP Load Balancer".
- ↑ "NSS 3.11.1 Release Notes". Mozilla.org. Retrieved 2011-03-08.
- ↑ "TLS Extensions". Gnu.org. 2010-08-01. Retrieved 2011-03-08.
- ↑ "Using Server Name Indication (SNI) with CyaSSL". wolfSSL.com. 2013-05-24. Retrieved 2013-11-25.
- ↑ 31.0 31.1 "Support TLS SNI extension in ssl module". Bugs.python.org. Retrieved 2011-03-08.
- ↑ 32.0 32.1 "QTBUG-1352. It would be useful if QSslSocket supports TLS extensions such as Server Name Indication as per RFC 3546.". Qt Bug Tracker. Retrieved 2011-04-15.
- ↑ "Java SE 7 Release Security Enhancements". download.oracle.com. Retrieved 2012-12-12.
- ↑ "HttpComponents HttpClient 4.3.2 Released". Retrieved 2014-01-21.
- ↑ "News: GNU wget 1.14 released". GNU Wget. 2012-10-19.
- ↑ "Android’s HTTP Clients". Google. Retrieved 3 August 2012.
- ↑ "Issue 12908: Https websites that support Server Name Indication (SNI) don't work". Google. Retrieved 3 August 2012.
- ↑ "IO::Socket::SSL Changes file mentions introduction of SNI".
- ↑ "Pike's SSL module". Retrieved 30 August 2013.
- ↑ "Understanding Certificate Name Mismatches". Blogs.msdn.com. Retrieved 2011-03-08.
- ↑ "Android issue 1290 - Https websites that support Server Name Indication (SNI) don't work". Code.google.com. 2010-12-01. Retrieved 2011-12-13.
- ↑ "IBM HTTP Server SSL Questions and Answers". Publib.boulder.ibm.com. Retrieved 2011-03-08.
- ↑ "IHS 8 powered by Apache 2.2.x ?". Publib.boulder.ibm.com. Retrieved 2011-03-08.
- ↑ "NSS Roadmap (as of 11 September 2009)". Wiki.mozilla.org. Retrieved 2011-03-08.
- ↑ "Implement TLS Server Name Indication for servers". Bugzilla@Mozilla. 2006-11-11. Retrieved 2012-10-30.
External links
- RFC6066 (obsoletes RFC4366 (which obsoleted RFC3546))
- https://alice.sni.velox.ch/ Test client-side TLS SNI capability