HTTPS¶
클라이언트와 M2, M2와 원본서버 구간 모두 HTTP/HTTPS 를 지원한다.
멀티 Domain 구성¶
한 대의 서버에서 여러 서비스를 동시에 운영할 경우 SSL설정이 문제가 될 수 있다. 대부분의 Web/Cache서버들은 HTTP 요청의 Host헤더를 보고 어떤 가상호스트에서 서비스할 것인지 결정한다.
일반적으로 SSL은 클라이언트(Browser)가 자신이 접속하려는 서버 도메인명(winesoft.co.kr)을 인증서를 통해 확인하는 것으로 신원확인을 한다. 만약 인증서로 신원확인이 되지 않는다면(잘못된 인증서 또는 유효기간 만료 등) 다음과 같이 사용자에게 신뢰여부를 묻는다(아예 차단하는 경우도 있다). 신뢰는 클라이언트가 하는 것이므로 정상적인 신원확인이 안되어도 계속 진행하길 원한다면 SSL통신이 이루어진다.
서버에서 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
)를 명시하여 하나의 인증서로 여러 도메인의 신원을 확인시킬 수 있는 방법이다.
서비스 주체가 같다면 효과적인 방법이지만 무관하다면 같은 인증서를 공유하는 것은 현실적으로 어렵다. 이 방법은 인증서만 교체하면 되는 것이므로 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+등급을 부여한다.
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"
}
]
}