마지막 수정 날짜 : 2018년 9월 18일


nginx 는 기본적으로 Strict SNI1  를 지원하지 않는다.

해외에서 Strict SNI 을 nginx 에 지원하는 것을 성공했지만, 아쉽게도 오류 메세지가 많이 뜬다고 하여 여러가지 연구를 해 봤고, 결국 성공하였다.

nginx-build 에는 strict_sni 라는 옵션을 만들어 두었지만, 여기 설명에는 단순히 패치 방법2만 올려두겠다.

  1. nginx 을 빌드하기 위한 준비물을 다운로드 받는다.
    – 관련 내용은 https://nginx.org/en/docs/configure.html 참조. 여기서는 직접 빌드할 수 있는 사람을 대상으로 설명한다.
    – openssl 은 1.1.1 버전을 기준으로 작성되었으므로 해당 버전을 다운로드 받는다.
  2. curl 이 설치되었는지 확인한다.
  3. nginx 디렉토리로 가서 다음과 같은 명령어를 입력한다.
    curl https://raw.githubusercontent.com/hakasenyang/openssl-patch/master/nginx_strict-sni.patch | patch -p1
  4. openssl 디렉토리 (–with-openssl 디렉토리) 로 가서 다음과 같은 명령어를 입력한다.
    curl https://raw.githubusercontent.com/hakasenyang/openssl-patch/master/openssl_ignore_log_strict-sni.patch | patch -p1
  5. default_server (http 안에서 server 단락이 오는 맨 첫 번째 부분) 설정에서 server_name 은 _ 등으로 설정하고, ssl 설정은 실제 운영중인 사이트와 그대로 똑같이 설정한다.
  6. 이제 아이피(https://~~~)로 접속하면 연결이 되지 않는다.

현재 내 서버에도 Strict SNI 가 적용되어 있고, SNI 가 지원되지 않는 브라우저 (IE 8 같은..) 들은 내 서버에 더 이상 접속할 수 없다.

위 방법이 어렵다면 내가 nginx 를 커스터마이징한 nginx-build 를 이용하자.

 

Thanks:
@JemmyLoveJennyStrict-SNI 소스 제공


  1. Strict SNI 의 구조는 단순하다. ClientHello 단계에서 SNI (Server Name Indicator) 라는 데이터가 정상적이지 않거나, 없는 경우 서버에서 Connection 을 reject 시키는 것이다. 즉, 모든 도메인 연결은 SNI 을 사용해야 하지만, SNI 가 없는 (한 아이피에 연결 된 기본 인증서) 데이터는 무시한다는 뜻이다. ↩
  2. 당연히 리눅스(CentOS, Ubuntu 등) 기준이다. ↩