HTTPS

클라이언트와 M2, M2와 원본서버 구간 모두 HTTP/HTTPS 를 지원한다.

See also

  • https 클라이언트 인증서 설정

  • https HTTPS 전역설정

멀티 Domain 구성

한 대의 서버에서 여러 서비스를 동시에 운영할 경우 SSL설정이 문제가 될 수 있다. 대부분의 Web/Cache서버들은 HTTP 요청의 Host헤더를 보고 어떤 가상호스트에서 서비스할 것인지 결정한다.

../../../_images/ssl_alert.png

일반적 HTTPS통신

일반적으로 SSL은 클라이언트(Browser)가 자신이 접속하려는 서버 도메인명(winesoft.co.kr)을 인증서를 통해 확인하는 것으로 신원확인을 한다. 만약 인증서로 신원확인이 되지 않는다면(잘못된 인증서 또는 유효기간 만료 등) 다음과 같이 사용자에게 신뢰여부를 묻는다(아예 차단하는 경우도 있다). 신뢰는 클라이언트가 하는 것이므로 정상적인 신원확인이 안되어도 계속 진행하길 원한다면 SSL통신이 이루어진다.

../../../_images/faq_ssl1.jpg

사용자에게 판단을 맡긴다.

서버에서 SSL을 사용하는 가상호스트가 하나라면 문제가 되지 않는다. 하지만 여러 개의 가상호스트를 동시에 운영하는 서버에서는 문제가 될 수 있다. 왜냐하면 서버가 클라이언트에게 인증서를 전달할 때(“일반적 HTTPS통신”의 “2. 인증서 전달”) 클라이언트가 어떤 Host에 접속하려는지 알 수 없기 때문이다.

이 문제를 극복하는 대표적인 방법은 다음과 같다.

방식

장점

단점

SNI

서버설정만으로 동작 (표준)

Windows XP와 IE6 미지원

Multi Certificate

인증서만 교체하여 동작

메인 도메인 또는 서비스 주체가 같아야 함

Multi Port

포트만 변경하여 동작

웹 페이지에서 HTTPS포트를 명시해주어야 함

Multi NIC

서버설정만으로 동작 (가장 널리쓰임)

NIC와 IP추가 구성필요

SNI (Server Name Indication)

SSL/TLS의 SNI(Server Name Indication) 확장필드를 사용하는 방식이다. 이 방식은 클라이언트가 서버에게 SSL 연결을 요청할 때 Server Name 확장필드를 명시함으로써 가능하다.

# env.network.https.enableSni

<HttpsSNI>OFF</HttpsSNI>
  • <HttpsSNI>

    • OFF (기본) Multi Port 또는 Multi NIC 방식으로 여러 인증서를 지원한다.

    • ON 같은 IP+Port 조합으로 여러개의 인증서를 지원한다. 아래의 경우처럼 443포트로 여러개의 인증서를 지원할 수 있다.

      # server.xml - <Server>
      
      <Https>
         <Cert>/usr/ssl/cert.pem</Cert>
         <Key>/usr/ssl/certkey.pem</Key>
         <CA>/usr/ssl/CA.pem</CA>
      </Https>
      
      <Https>
         <Cert>/usr/ssl_another/cert.pem</Cert>
         <Key>/usr/ssl_another/certkey.pem</Key>
         <CA>/usr/ssl_another/CA.pem</CA>
      </Https>
      

<HttpsSNI> 는 동적으로 변경이 불가능하다. 설정변경 후 반드시 서비스를 재가동해야 한다.

Note

SNI는 2003년 6월 RFC 3546 를 통해 TLS 1.0이상에서만 정의되었습니다. 따라서 SSL v3에서는 SNI를 지원하지 않습니다. 참고로 OpenSSL의 s_client에 SSL-3.0 옵션을 적용하면 SNI 확장필드를 보내지 않습니다.

현재까지 가장 우아한 방법이지만 일부 구버전 클라이언트에서 지원하지 않는다. 다음은 SNI를 지원하지 않는 클라이언트 목록이다. (출처: Wikipedia - Server Name Indication )

  • Internet Explorer (any version) on Windows XP or Internet Explorer 6 or earlier

  • Safari on Windows XP

  • BlackBerry Browser

  • Windows Mobile up to 6.5

  • Android default browser on Android 2.x[34] (Fixed in Honeycomb for tablets and Ice Cream Sandwich for phones)

  • wget before 1.14

  • Java before 1.7

Wildcard Certificate

한 인증서에 여러 도메인을 넣거나 Wildcard(i.e. *.winesoft.co.kr )를 명시하여 하나의 인증서로 여러 도메인의 신원을 확인시킬 수 있는 방법이다.

../../../_images/faq_ssl2.jpg

하나의 인증서로 여러 Domain을 인증한다.

서비스 주체가 같다면 효과적인 방법이지만 무관하다면 같은 인증서를 공유하는 것은 현실적으로 어렵다. 이 방법은 인증서만 교체하면 되는 것이므로 M2에서 별도로 설정할 것은 없다 [ DigiCert 참고].

Multi Port

SSL/TLS는 443포트를 사용한다. 중복되지 않는 포트를 이용하여 인증서를 여러개 설치할 수 있다. 클라이언트에서는 다음과 같이 포트를 명시함으로써 SSL통신이 가능하다.

https://winesoft.co.kr:543/

M2에서는 다음과 같이 hosting[].https.options.listen 설정에 포트를 명시하여 인증서를 여러개로 설정한다.

"https" : [
   {
      # A사 인증서
   },
   {
      # B사 인증서
      "options": {
         "listen" : "*:543"
      }
   },
   {
      # C사 인증서
      "options": {
         "listen" : "*:544"
      }
   }
]

이 방법은 가장 경제적이기는하나 모든 웹페이지 링크에 HTTPS 포트를 명시해야 하는 문제가 있다.

Multi NIC

서버의 NIC가 여러개로 구성되어 있다면 NIC마다 IP를 별도로 할당할 수 있다. 그러므로 서버 IP마다 별도의 인증서를 설치하여 클라이언트가 접속한 서버IP에 기반하여 인증서를 결정하도록 설정한다. M2에서는 다음과 같이 hosting[].https.options.listen 설정에 IP를 명시하여 인증서를 여러개로 설정한다.

"https" : [
   {
      # A사 인증서
      "options": {
         "listen" : "10.10.10.10"
      }
   },
   {
      # B사 인증서
      "options": {
         "listen" : "10.10.10.11"
      }
   },
   {
      # C사 인증서
      "options": {
         "listen" : "10.10.10.12"
      }
   }
]

Note

IP 주소가 유동적이라면 NIC이름으로 설정한다.

"https" : [
   {
      # A사 인증서
      "options": {
         "listen" : "eth0"
      }
   },
   {
      # B사 인증서
      "options": {
         "listen" : "eth1"
      }
   },
   {
      # C사 인증서
      "options": {
         "listen" : "eth2"
      }
   }
]

HSTS

HSTS(HTTP Strict Transport Security)modify 를 이용해 손쉽게 구현이 가능하다.

# functions.network.http.frontEnd.headers.modify

"modify": {
  "enable": true,
  "matchingList": [
    {
      "pattern": "*",
      "header": "$RES[Strict-Transport-Security: max-age=31536000; includeSubDomains]",
      "mode": "set"
    }
  ]
}

Qualys SSL Server Test 에서는 HSTS가 적용된 사이트에 대해서만 A+등급을 부여한다.

../../../_images/qualys_a_plus.png

보안등급은 주기적으로 점검합시다

CipherSuite 지원

지원되는 CipherSuite 목록은 아래와 같다.

TLS 1.3

  • TLS_AES_256_GCM_SHA384 0x13, 0x02

  • TLS_CHACHA20_POLY1305_SHA256 0x13, 0x03

  • TLS_AES_128_GCM_SHA256 0x13, 0x01

TLS 1.2

  • ECDHE-ECDSA-AES256-GCM-SHA384 0xC0, 0x2C

  • ECDHE-RSA-AES256-GCM-SHA384 0xC0, 0x30

  • DHE-RSA-AES256-GCM-SHA384 0x00, 0x9F

  • ECDHE-ECDSA-CHACHA20-POLY1305 0xCC, 0xA9

  • ECDHE-RSA-CHACHA20-POLY1305 0xCC, 0xA8

  • DHE-RSA-CHACHA20-POLY1305 0xCC, 0xAA

  • ECDHE-ECDSA-AES256-CCM8 0xC0, 0xAF

  • ECDHE-ECDSA-AES256-CCM 0xC0, 0xAD

  • DHE-RSA-AES256-CCM8 0xC0, 0xA3

  • DHE-RSA-AES256-CCM 0xC0, 0x9F

  • ECDHE-ECDSA-AES128-GCM-SHA256 0xC0, 0x2B

  • ECDHE-RSA-AES128-GCM-SHA256 0xC0, 0x2F

  • DHE-RSA-AES128-GCM-SHA256 0x00, 0x9E

  • ECDHE-ECDSA-AES128-CCM8 0xC0, 0xAE

  • ECDHE-ECDSA-AES128-CCM 0xC0, 0xAC

  • DHE-RSA-AES128-CCM8 0xC0, 0xA2

  • DHE-RSA-AES128-CCM 0xC0, 0x9E

  • ECDHE-ECDSA-AES256-SHA384 0xC0, 0x24

  • ECDHE-RSA-AES256-SHA384 0xC0, 0x28

  • DHE-RSA-AES256-SHA256 0x00, 0x6B

  • ECDHE-ECDSA-AES128-SHA256 0xC0, 0x23

  • ECDHE-RSA-AES128-SHA256 0xC0, 0x27

  • DHE-RSA-AES128-SHA256 0x00, 0x67

  • AES256-GCM-SHA384 0x00, 0x9D

  • AES256-CCM8 0xC0, 0xA1

  • AES256-CCM 0xC0, 0x9D

  • AES128-GCM-SHA256 0x00, 0x9C

  • AES128-CCM8 0xC0, 0xA0

  • AES128-CCM 0xC0, 0x9C

  • AES256-SHA256 0x00, 0x3D

TLS 1.1/TLS 1.0

  • ECDHE-ECDSA-AES256-SHA 0xC0, 0x0A

  • ECDHE-RSA-AES256-SHA 0xC0, 0x14

  • ECDHE-ECDSA-AES128-SHA 0xC0, 0x09

  • ECDHE-RSA-AES128-SHA 0xC0, 0x13

  • ECDHE-ECDSA-DES-CBC3-SHA 0xC0, 0x08

  • ECDHE-RSA-DES-CBC3-SHA 0xC0, 0x12

SSL 3

  • DHE-RSA-AES256-SHA 0x00, 0x39

  • DHE-RSA-AES128-SHA 0x00, 0x33

  • DHE-RSA-SEED-SHA 0x00, 0x9A

  • DHE-RSA-DES-CBC3-SHA 0x00, 0x16

CipherSuite 조회

CipherSuite 설정결과를 조회한다. CipherSuite표현식은 OpenSSL 1.0.0E 를 준수한다.

http://127.0.0.1:10040/monitoring/ssl?ciphersuite=...

결과는 JSON형식으로 제공된다.

{
    "version": "2.0.0",
    "method": "ssl",
    "status": "OK",
    "result":
    [
        {
            "Name" : "AES128-SHA",
            "Ver" : "SSLv3",
            "Kx" : "RSA",
            "Au" : "RSA",
            "Enc" : "AES(128)",
            "Mac" : "SHA1"
        },
        {
            "Name" : "AES256-SHA",
            "Ver" : "SSLv3",
            "Kx" : "RSA",
            "Au" : "RSA",
            "Enc" : "AES(256)",
            "Mac" : "SHA1"
        }
    ]
}