Server Name Indication (SNI) is an extension to the Transport Layer Security (TLS) computer networking protocol by which a client indicates which hostname it is attempting to connect to at the start of the handshaking process. The extension allows a server to present one of multiple possible certificates on the same IP address and TCP port number and hence allows multiple secure (HTTPS) websites (or any other service over TLS) to be served by the same IP address without requiring all those sites to use the same certificate. It is the conceptual equivalent to HTTP/1.1 name-based virtual hosting, but for HTTPS. This also allows a proxy to forward client traffic to the right server during TLS/SSL handshake. The desired hostname is not encrypted in the original SNI extension, so an eavesdropper can see which site is being requested. The SNI extension was specified in 2003 in .

Background of the problem
Prior to SNI, when making a TLS connection, the client had no way to specify which site it was trying to connect to. Hence, if one server hosts multiple sites on a single listener, the server has no way to know which certificate to use in the TLS protocol. In more detail, 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 occurs, the connection proceeds as normal. If a match is not found, the user may be warned of the discrepancy and the connection may abort 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.

However, it may be hard – 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. 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). It is possible to use subjectAltName to contain multiple domains controlled by one person 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 was 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 could be served from the same IP address.

In practice, this meant that an HTTPS server could only serve one domain (or small group of domains) per IP address for secured and efficient 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 exhausted. For IPv6, it increases the administrative overhead by having multiple IPs on a single machine, even though the address space is not exhausted. The result was that many websites were effectively constrained from using secure communications.

Technical principles 
SNI addresses this issue by having the client send the name of the virtual domain as part of the TLS negotiation's ClientHello message. 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 implement SNI, a server with a single IP address can 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.

Security implications 

Server Name Indication payload is not encrypted, thus the hostname of the server the client tries to connect to is visible to a passive eavesdropper. This protocol weakness was exploited by security software for network filtering and monitoring and governments to implement censorship. Presently, there are multiple technologies attempting to hide Server Name Indication.

Domain fronting 

Domain fronting is a technique of replacing the desired host name in SNI with another one hosted by the same server or, more frequently, network of servers known as Content Delivery Network. When a client uses domain fronting, it replaces the server domain in SNI (unencrypted), but leaves it in the HTTP host header (which is encrypted by TLS) so that server can serve the right content. Domain fronting violates the standard defining SNI itself, so its compatibility is limited (many services check that SNI host matches the HTTP header host and reject connections with domain-fronted SNI as invalid). While domain fronting was used in the past to avoid government censorship, its popularity dwindled because major cloud providers (Google, Amazon's AWS and CloudFront) explicitly prohibit it in their TOS and have technical restrictions against it.

Encrypted Client Hello 
Encrypted Client Hello (ECH) is a TLS 1.3 protocol extension that enables encryption of the whole Client Hello message, which is sent during the early stage of TLS 1.3 negotiation. ECH encrypts the payload with a public key that the relying party (a web browser) needs to know in advance, which means ECH is most effective with large CDNs known to browser vendors in advance.

The initial 2018 version of this extension was called Encrypted SNI (ESNI) and its implementations were rolled out in an "experimental" fashion to address this risk of domain eavesdropping. Firefox 85 removed support for ESNI. In contrast to ECH, Encrypted SNI encrypted just the SNI rather than the whole Client Hello. Opt-in support for this version was incorporated into Firefox in October 2018 and required enabling DNS-over-HTTPS.

In March 2020, ESNI was reworked into the ECH extension, after analysis demonstrated that encrypting only the SNI is insufficient. For example, specifications permit the Pre-Shared Key extension to contain any data to facilitate session resumption, even transmission of a cleartext copy of exactly the same server name that is encrypted by ESNI. Also, encrypting extensions one-by-one would require an encrypted variant of every extension, each with potential privacy implications, and even that exposes the set of extensions advertised. Lastly, real-world deployment of ESNI has exposed interoperability limitations. The short name was ECHO in March 2020 and changed to ECH in May 2020.

Both ESNI and ECH are compatible only with TLS 1.3 because they rely on KeyShareEntry which was first defined in TLS 1.3. Also, to use ECH, the client must not propose TLS versions below 1.3.

Another Internet Draft, incorporates a parameter for transmitting the ECH public keys via HTTPS and SVCB DNS record types, shortening the handshake process.

In August 2020, the Great Firewall of China started blocking ESNI traffic, while still allowing ECH traffic.

In October 2020, Russian ISP Rostelecom and its mobile operator Tele2 started blocking ESNI traffic. In September of the same year, Russian censorship ministry Roscomnadzor planned to ban a range of encryption protocols, among which were TLS 1.3 and ESNI, which hindered web site access censorship.

In July 2023, in the IETF117 meeting, members working on ECH informed Chrome and Firefox were doing a 1% sample trial, and the team expects the final draft to be submitted to the IESG evaluation by January 2024.

In Sep 2023, Cloudflare started to support ECH for hosted domains.

In October 2023, Mozilla enabled ECH by default in Firefox v118.

Implementation 
In 2004, a patch for adding TLS/SNI into OpenSSL was created by the EdelKey project. 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 (first released in 0.9.8f).

For an application program to implement SNI, the TLS library it uses must implement it and the application must pass the hostname to the TLS library. Further complicating matters, the TLS library may either be included in the application program or be a component of the underlying operating system. Because of this, some browsers implement SNI when running on any operating system, while others implement it only when running on certain operating systems.

Support

References

External links 
  (obsoletes , which obsoleted )

Internet protocols
Secure communication
Web hosting
Transport Layer Security
서버 네임 인디케이션(Server Name Indication, SNI)은 컴퓨터 네트워크 프로토콜인 TLS의 확장으로, 핸드셰이킹 과정 초기에 클라이언트가 어느 호스트명에 접속하려는지 서버에 알리는 역할을 한다. 이를 이용하면 같은 IP 주소와 TCP 포트 번호를 가진 서버로 여러 개의 인증서를 사용할 수 있게 되고, 따라서 모든 사이트가 같은 인증서를 사용하지 않아도 동일한 아이피로 여러 HTTPS 웹사이트(또는 TLS 상에서 돌아가는 다른 서비스)를 운영할 수 있게 된다. 개념상으로는 HTTP/1.1의 이름 기반의 가상 호스팅과 동일하지만 이 경우엔 HTTPS 통신에 쓰인다는 차이가 있다. 원본 SNI 확장의 경우 원하는 호스트명 정보가 암호화되어 있지 않기 때문에 사용자가 어느 사이트에 통신을 요청하는지 감청할 수 있다는 문제점이 있다.

배경지식 
클라이언트에서 TLS 연결을 생성하려면 먼저 웹 서버로 디지털 인증서를 요청하게 된다. 서버가 인증서를 보내면 클라이언트는 이를 읽고 연결하려던 호스트명과 인증서에 적힌 이름이 일치하는지 확인한다. 일치하는 경우 정상적으로 연결 절차가 진행되나, 일치하지 않는 경우 누군가 중간자 공격을 시도하고 있다는 조짐이므로 경고문이 나타나거나 또는 연결이 중단된다. 그러나 일부 애플리케이션의 경우 경고를 무시하고 사용자가 연결을 강제 진행할 수 있도록 하기도 하는데, 해당 인증서 또는 연결을 신뢰할 수 있는 경우에만 진행해야 하며 결과에 대한 책임은 사용자가 지게 된다.

그러나 인증서 하나에 모든 호스트명을 다 구겨넣으려면 사전에 호스트명을 모두 알고 있어야 하는데 이는 때때로 어렵거나 또는 불가능한 일이다. 이 때문에 호스트명이 여러 개인 서버는 각각의 호스트명에 대응하는 (또는 몇몇 호스트명에 동시에 대응하는) 서로 다른 인증서를 가지고 있을 필요가 있다. 2005년 이래로 CAcert에서는 가상 서버에서 TLS를 사용하기 위한 방책을 만들기 위해 여러 실험을 진행했으나 대부분 결과가 만족스럽지 못하거나 방법이 비현실적이어서 실패로 끝났다. 예를 들면 subjectAltName 필드를 이용해 개개인이 인증서 하나에 자신이 소유한 도메인 여러 개를 모두 넣을 수 있는데, 이렇게 만든 "통합 통신 인증서 (unified communications certificates)"에 도메인을 새로 넣거나 빼려면 매번 인증서를 재발급받아야 한다.

이름 기반 가상 호스팅의 경우 아이피 하나를 통해 서버 (통상적으로 웹 서버) 하나에서 여러 DNS 호스트명을 사용할 수 있게 해 주는데, 이 경우 클라이언트에서 프로토콜의 일부로써 보낸 호스트명을 이용한다 (HTTP의 경우 host 헤더에 호스트명을 적어 보낸다). 그러나 HTTPS 통신에서는 TLS 핸드셰이크 시점에서 아직 서버가 HTTP 헤더를 읽을 수 없기 때문에 서버가 HTTP host 헤더를 읽어 어떤 인증서를 보낼지 선택하는 작업이 불가능하게 되고, 따라서 한 아이피당 한 인증서만을 사용해 거기 포함된 호스트명만을 사용할 수 있다.

실질적으로 이는 안전하고 효율적인 브라우징을 위해 HTTPS 서버가 IP당 사용할 수 있는 도메인 수가 매우 한정되어 있다는 것을 뜻한다. 그렇다고 각 사이트마다 IP를 배당하자니, 새 IP를 요청하려면 대륙별 인터넷 레지스트리의 승인도 받아야 하고 IPv4 주소 자체도 거의 고갈된 상태기 때문에 결국 호스팅 비용을 배가시키는 꼴이 된다. 결과적으로 많은 웹사이트들이 사실상 IPv4를 통한 보안 통신을 할 수 없는 상태에 이른다. IPv6 주소는 고갈되지 않았으므로 IPv6을 이용한 웹사이트는 이 문제의 영향을 받지 않는다.

SNI를 이용한 해결책 
SNI를 이용하면 TLS 핸드셰이크 과정에서 현재 접속하려는 가상 도메인의 호스트명을 서버로 전송해 이 문제를 해결할 수 있다. 이렇게 하면 서버에서 가상 도메인 호스트명을 먼저 알 수 있게 되므로 해당 호스트명에 맞는 인증서를 선택해 전송할 수 있게 된다. 따라서 클라이언트와 서버가 모두 SNI를 지원할 경우 인증서 하나에 넣기에는 너무 많았던 도메인 네임들을 IP 하나로 모두 사용할 수 있게 된다.

SNI는 2003년 6월 IETF의 인터넷 RFC에 RFC 3546 Transport Layer Security (TLS) Extension이란 제목으로 처음 추가되었다. 해당 표준의 최신 버전은 RFC 6066이다.

보안 측면 
접속하려는 호스트명 정보가 암호화되지 않기 때문에 사용자가 어떤 사이트에 접속하는지 타인이 엿볼 수 있으며, 이를 이용해 보안 회사에서 필터링 기술을 개발하거나 한국 등의 정부에서 통신 검열에 활용하기도 한다. 한때 대안으로 도메인 프론팅 방식을 사용했으나 현재 구글과 AWS 모두 이를 금지했으므로 대안으로서의 효용성은 감소하였다.

2018년 중반 현재, 도메인 감청을 방지하기 위해 암호화된 SNI (Encrypted SNI, ESNI) 라는 이름의 업그레이드가 "실험적 단계"로서 진행되었고, 후에 ECH (Encrypted Client Hello) 라는 이름으로 IETF에서 표준화가 진행중이며, 현재는 Draft 단계이다.

구현 
2004년 EdelKey 프로젝트에서 OpenSSL에 TLS/SNI를 추가하는 패치를 작성하였다. 2006년 이 패치가 OpenSSL의 개발 브랜치에 이식되고, 2007년에 OpenSSL 0.9.8에 백포팅되었다 (0.9.8f에서 처음 배포되었다).

SNI를 사용하려는 애플리케이션의 경우 이를 구현한 TLS 라이브러리를 사용하여 해당 라이브러리에 호스트명을 전달하여야 한다. 이때 해당 TLS 라이브러리를 애플리케이션의 일부로 포함할 수도 있고 운영체제가 지원하는 TLS 기능을 사용할 수도 있는데, 이 때문에 어떤 브라우저는 모든 운영체제에서 SNI를 지원하는 데에 반해 다른 브라우저는 특정 운영체제에서만 SNI를 지원하는 일도 있다.

지원

각주

외부 링크 
 RFC 6066 (obsoletes RFC 4366, which obsoleted RFC 3546)

인터넷 프로토콜
웹 호스팅
전송 계층 보안