SNI

 

Server Name Indication
1. 개요
2. 암호화
2.1. ESNI
2.2. ECH
3. 인터넷 검열
3.1. 2019년 2월 11일 해외 사이트 차단
4. 도메인 프런팅
5. 관련 문서


1. 개요


TLS의 확장 표준 중 하나로, 인증서에서 사용하는 방식이다.
이 기술이 나오게 된 큰 이유는 하나의 웹서버가 여러 웹사이트를 서비스하면서 인증서 인증에 문제가 생겼기 때문이다. 기존까지는 대상 서버의 IP 주소와 도메인이 1:1 대응 관계라서 서버의 인증서 제공에 문제가 없었지만, 여러 도메인을 하나의 IP 주소로 연결하는 서비스가 대중화되면서 보낼 인증서를 특정하지 못하게 되었다. 이 때문에 클라이언트가 사이트에 접속하면서 도메인 정보를 보내도록 변경한 것이다.
이 SNI를 사용하게 되면 하나의 웹 서버에서 여러 도메인의 웹사이트를 서비스하는 경우에도 인증서를 사용한 HTTPS를 활성화시킬 수 있다.

2. 암호화


TLS 표준에는 SNI 암호화가 없어서, SNI 부분이 평문 형태로 전송된다. 이로 인해 제 3자에게 쉽게 노출이 되어 보안 문제가 생기기 때문에, TLS에 SNI의 암호화 규격을 추가하는 문제는 오랜 기간 논의되어 왔다.
DNS 암호화랑 달리 초안, 즉 비표준이다. 그런 이유로 '''Firefox는 실험적으로 지원하고, 나머지 브라우저들은 지원하지 않는다.''' 나무위키도 파이어폭스로 접속하면 SSL_ERROR_MISSING_ESNI_EXTENSION이라는 오류가 뜰 때가 많다.

2.1. ESNI


2018년 7월 2일Apple, Cloudflare, Fastly, Mozilla에 의해 작성된, TLS 1.3을 전제로 한 확장 규격으로서의 SNI 암호화 규격의 초안 문서가 IETF에 등재됐다. '''Encrypted Server Name Indication''', 줄여서 '''ESNI''' 라고 한다.
2018년 9월 24일에 Cloudflare가 위 초안 규격에 의한 ESNI 시범 서비스를 개시했다.
2018년 12월 12일부터 Firefox의 최신 안정화 버전에서 ESNI 지원이 시작되었다. 반면 2019년 2월 기준 엣지, 크롬 등 다른 브라우저에서는 지원되지 않는다. IE는 지원될 가능성이 '''절대''' 없으니 제발 갖다 버리자.
이 ESNI 구현은 클라이언트 브라우저에 서버의 공개키가 전달되는 시점을 DNS 통신 단계로 앞당겨서, 서버와 연결하는 시점에 해당 공개키로 도메인이 암호화될 수 있도록 하는 것이다. 파이어폭스는 ESNI 구현이 DNS 통신의 암호화가 이루어지지 않는 상황에서는 별 의미가 없다는 점을 들어, ESNI가 작동하려면 DoH(DNS over HTTPS)가 활성화되어 있을 것을 요구하고 있다. 차후 운영체제 기능에 DNS 통신 암호화가 구현되거나 플래그 등이 만들어져서 암호화 통신인지 아닌지를 구분할 수 있게 된다면 운영체제 기능으로도 ESNI를 쓸 수 있도록 제약이 풀릴 듯.
모질라 파이어폭스(버전 64 이상)에서의 활성화 방법
1. 파이어폭스 주소창에 about:config 를 쳐서 고급 설정창에 접속한다. 경고 메시지가 뜨면, 「위험을 감수하겠습니다!」 버튼을 눌러 진행한다.
1. 화면 상단의 검색창에 trr이라고 입력한다. 자동으로 검색이 이루어진다.
1. network.trr.mode라는 설정값의 숫자를 2로 바꾼다.[1]
1. 만약에 network.trr.uri가 비어있다면 https://mozilla.cloudflare-dns.com/dns-query로 바꾼다. 최신 버전을 신규 설치하였을 경우 이 부분에 이미 해당 주소값이 입력되어 있으므로, 건드릴 필요 없다.
1. 화면 상단의 검색창에서 trr을 지운 다음 esni라고 입력하여 검색한다.
1. network.security.esni.enabled를 true로 바꾼다.
1. 고급 설정창을 닫는다.
조금 더 설정하고 싶은 사람들을 위한 설명
network.trr.mode

0은 기본값(현재는 해당 기능을 사용하지 않음), 1은 DNS와 DoH[2] 중 빠른 쪽을 택해서 접속, 2는 DoH 접속을 먼저 시도한 다음 실패하면 DNS로 접속, 3은 DoH만 이용, 5는 이 기능을 완전히 꺼버림.
network.trr.uri

DoH를 이용할 주소. DoH의 정의상 반드시 https://로 시작하는 주소라야 한다. 현재 사용가능한 주소는 https://mozilla.cloudflare-dns.com/dns-queryhttps://dns.google.com/experimental, https://dns.quad9.net/dns-query 그리고 https://dns.adguard.com/dns-query등이 있다.
network.trr.bootstrapAddress

network.trr.uri
에 기재된 DoH 서버의 IP 주소. DoH 서버에 접속하는 초기단계에 서버명을 IP주소로 변환해야 하는데, 보통 이는 기본 DNS를 이용하여 이뤄지지만 기본 DNS가 DoH 서버를 막는 경우나 또는 기본 DNS를 전혀 쓰지 않는 경우 (즉
network.trr.mode
를 3으로 설정한 경우) DoH 서버명을 수동으로 변환한 결과를 여기에 입력한다. https://dns.google.com/등의 DNS도구로 DoH 서버명을 변환하여 나온 결과를 적어주면 된다.
mozilla.cloudflare-dns.com
→ 104.16.248.249,
dns.google.com
→ 8.8.8.8 이런 식이다.
network.trr.wait-for-portal

와이파이 접속시 처음에 광고 페이지 등이 강제로 뜨는지 확인할지의 여부. 그런 광고 페이지에서는 보통 DoH를 이용할 수 없기 때문에 존재하는 옵션이다. 되도록이면 기본값인 true로 놔두고 건드리지 말자.
network.trr.confirmationNS

위 wait-for-portal을 확인하기 위해서 쓰는 사이트 주소. 기본값은 http://example.com이다. 건드릴 필요 없다.
Firefox 브라우저를 재시작[3]한 후 클라우드플레어 ESNI Checker 사이트에서 정상적용 여부를 확인할 수 있다. 단, DNS가 클라우드플레어가 아닌 경우 Secure DNS 항목은 불확실할 수 있다.
자잘한 팁으로, 가끔 ESNI 작동이 풀릴 경우 network.trr.mode 및 network.security.esni.enabled 설정을 바꿨다가 복원하면 기능이 돌아온다.
클라우드플레어를 이용하는 개별 웹사이트에서 암호화 여부를 알고 싶다면, 도메인 뒤에 /cdn-cgi/trace를 붙여 접속하면 된다. 나무위키라면 https://namu.wiki/cdn-cgi/trace로, 파이어폭스에서 위 설정을 마친 뒤 접속하면 tls=TLSv1.3, sni=encrypted라는 값이 나올 것이다.
2018년 10월 24일, 미국 오레곤 상원의원 Ron Wyden이 미국 국토안보부에 국내 기업들에 대한 DNS 암호화 및 ESNI의 적용을 지원할 수 있도록 움직여달라고 요청하였다. #
'''2021년 1월 26일에 출시되는 Firefox 85부터는 후술할 ECH로 대체되어 지원이 삭제된다. 기존 ESNI를 사용해야 한다면 장기지원용 ESR 버전을 사용해야 한다.'''

2.2. ECH


2020년 6월 1일, '''Encrypted ClientHello''', 줄여서 '''ECH''' 라는 명칭을 가진 새 암호화 규격이 공개되었다. SNI 암호화 기술이 확대되어 TLS의 ClientHello 전부를 암호화하도록 변경되었다. 평문 SNI인 ClientHelloOuter와 암호화된 SNI인 ClientHelloInner로 이루어저 있으며, 서버가 암호화를 지원하면 ClientHelloInner를, 지원하지 않으면 ClientHelloOuter를 사용하는 방식이다. 그러나 이렇게 될 경우 상황에 따라서 ClientHelloOuter의 평문 SNI를 탈취해서 다시 검열이 가능해 질 거라는 우려의 목소리도 있다.[4] 본격적으로 서비스가 시작되어야 사실 여부를 알 수 있으니 너무 절망하지는 말자.
2021년 1월 26일, Firefox 85가 출시되면서 기존의 ESNI 지원이 삭제되고, ECH로 대체되었다. 그러나 클라우드플레어 등에서 ECH를 아직 지원하지 않기 때문에 현재 ESNI 기술이 상당수의 웹사이트에서 제대로 동작하지 않고 있다. 그렇지만 클라우드플레어 역시 ESNI에서 ECH로의 움직임을 보이고 있기 때문에 아직까지 그림의 떡으로 단정짓기엔 이르다.
about:config에서
network.dns.echconfig.enabled
,
network.dns.use_https_rr_as_altsvc
true
로 설정하여 ECH를 활성화시킬 수 있다.

3. 인터넷 검열


현재 HTTPS는 암호화를 위해 TLS를 이용하는데, 이 경우 인증 후의 사용자와 웹서버 사이의 통신은 암호화되지만, 인증 과정에서 발생하는 통신은 암호화되지 않고 진행된다. 이 인증 과정에서 SNI 패킷을 주고 받아야 하고, 이 SNI 패킷에 기록된 도메인을 보고 특정 웹사이트를 차단하는 식으로 이용이 가능하다. 후술할 해외 사이트 차단이 바로 이 방법을 이용한 것이다.
위에 나와 있듯이 웹사이트가 TLS 1.3을 지원하고 SNI 암호화가 구현된 서버 프로그램을 사용하면 SNI 패킷에 기록된 도메인 또한 암호화되므로 차단을 회피할 수 있으나, 아직 정식 표준으로 채택되지 않은 초안 단계이기 때문에 적용되는 곳이 많지 않다. 예를 들어 클라우드플레어를 사용하는 사이트는 TLS 1.3와 SNI 암호화가 지원되기 때문에 차단되어도 들어갈 수 있다. 하지만 클라우드플레어를 이용하지 않는 사이트도 상당히 많고, 그런 사이트들은 직접 보안 업데이트를 준비해야 해서 TLS 1.3 버전의 도입도 늦어지므로 표준화되지 않은 SNI 암호화의 도입은 상당히 먼 일이 된다. 웹 브라우저 또한 아직 모질라 파이어폭스만 지원하며, 그마저도 직접 활성화해야 한다. 대표적인 TLS 통신 소프트웨어인 OpenSSL은 SNI 암호화에 대해 표준 등재 이후에 지원할 것이라 언급하기도 했다. nginx 같은 웹서버도 기본적으로 OpenSSL을 활용하고 있기 때문에 OpenSSL의 SNI 암호화 구현 이후에야 지원 가능할 것이라고 한다. #

3.1. 2019년 2월 11일 해외 사이트 차단




4. 도메인 프런팅


클라우드 서비스를 사용하는 사이트에 이 SNI 영역을 허위의 도메인 정보로 속여서 연결하는 기법을 도메인 프런팅(Domain fronting)이라고 한다. 이 기법은 인터넷 검열에 대항하기 위해 상당히 쓰인 바 있고, 우회기술을 사용한 중국인 중 35%가 이 기법을 사용하는 것으로 나타나기도 했다. 하지만, 이 기법은 동시에 해킹 등으로 악용되기도 하였기 때문에(텔레그램의 도메인 프런팅 행위에 대한 러시아 정부의 압박이라는 설도 있다), 구글과 아마존은 약관에 근거하여 도메인 프런팅 행위를 막았고, 이에 영향을 받은 Signal Private Messenger 측은 두 회사를 비판하는 성명을 게시하기도 하였다.


5. 관련 문서



[1] TRR관련 설정은 브라우저 설정창의 네트워크 설정에서도 접근 가능하고, 여기서 편집하는것을 권장한다.[2] DNS over HTTPS[3] 최신 Nightly 버전의 경우 재시작할 필요 없이 곧바로 설정이 적용되지만, 잘 안 되는 경우도 있기 때문에 가급적 한번 완전히 껐다 켜주는 것이 확실하다.[4] ECH 미지원 사이트는 검열의 영향을 받는 것으로 볼 때, 실제로 미지원 사이트에서의 탈취는 가능한 것으로 보인다.