[WebTier/OSSL] SSL VirtualHost With SNI
1. Overview
Oracle HTTP Server 12.2.1.4 에서 SNI 가 지원되는지, SSL VirtualHost 사용 시 유의할 점을 살펴보자.
2. SNI
SNI(Server Name Indication).
사용자의 HTTP Request 내에는 Host Header가 있으며, 여기에 사용자가 도달하려는 ServerName이 있다.
이것을 가지고, Web server는 Any Virtual Host section에 사용자를 할당할 수 있다.
HTTPS Request 는 암호화된 Packet을 추출해야, Host Header를 볼 수 있으나, Packet을 추출한다는 건, SSL Handshake 과정의 이후에 가능한 일이다.
SSL Virtual Host section에 사용자를 할당해야, SSL Handshake 과정이 이루어지는데, 그 전에 Host header를 알 수가 없으니, SSL Virtual Host section에 할당을 하지 못한다. (말장난 같으나)
이를 위해, SSL Handshake 이전, 즉. Client Hello 와 관계 없이 SNI 라는 제공되는 Field 를 통해서 ServerName을 추출할 수 있다.
최근에는 이 값 또한 암호화 되어야 한다고 논의 중인 것으로 알고 있다.
어찌되었든, SNI 는 그런 종류의 Data이다.
3. SNI with OHS
OHS 에서는 SNI 기능을 공식적으로 지원하지 않는다.
mod_ossl 모듈에서 SNI 기능을 제공하지 않는다는 의미이다.
내부적으로는, 제한적으로 SNI 기능을 지원한다.
자세한 내용은, Internal Docs 이므로 공개할 수 없지만, NZ library (mod_ossl 구현체) 의 SSL 지갑인 NZ Wallet은 Single Listener (same IP:PORT) 에서는 모두 동일해야 한다는 것이다.
즉 시스템에 IP:Port가 모두 동일한 Virtual Host는 단일(Single) Listener 로 보는 것이며,
단일 Listner는 모두 공통된 NZ Wallet에 상속되는 것이다.
NZ Wallet 뿐만 아니라, SSL/TLS Protocol set 또한 단일 Listener 에 동일해야 한다.
NZ Library 으로 구현된 NZ Wallet (OWM; Oracle Wallet Manager) 에 의해 이러한 제약조건 또는 보안취약점을 해소하기 위한 기능상의 이유로 단일 Listner를 갖는 Virtaul Host 에서는 제한적으로 SNI를 지원하게 된 것이다.
Apache와 자주 비교하게 되는데, Apache의 SNI를 이용한 Name-Based Virtual Host가 OHS에서는 지원되지 않는 이유다.
Apache는 Apache 2.22 에서 SNI 지원이 내장된 mod_ssl을 사용하여 Name-Based VH가 제공되고 있다.
SNI는 단순히, SSL Client Hello 전에 알 수 있는 Data로 알고 있는데… NZ Library에서 SNI를 부분적으로 지원한다는거에 관련한 정확한 의미를 이해하지 못하기도 했다.
4. SSL Virtual Host with Apache
Apache 2.4.37 에서 SSL Virtual Host 개별로 SSLProtocol 지정 시 첫번째 VirtualHost Section의 SSLProtocol이 전역적으로 정의되는 것으로 Bug가 등록되었다.
Apache 의 SSL인 OpenSSL 에도 관련 Bug가 등록되었으나, Apache issue로 closed 되었다.
다음과 같은 코드가 Apache 에 구현되고, x.x.x.x:443
으로 Address 는 동일하나, ServerName
이 A.com
과 B.com
으로 별개의 서비스가 제공되기를 원했으나 Bug으로 인해 TLSv1.2 로만 Handshake가 발생한다는 것이다.
1
2
3
4
5
6
7
8
9
10
11
Listen x.x.x.x:443
<vhost x.x.x.x:443>
ServerName A.com
SSLProtocol TLSv1.2
</vhost>
<vhost x.x.x.x:443>
ServerName B.com
SSLProtocol TLSv1.3
</vhost>
해당 Bug는 Apache 2.4.42 에서 Fixed 되었다.
5. SSL Virtual Host with OHS
Apache와 다른 SSL Library인 NZ 를 사용하는 OHS 에서는,
Single Listner 의 사용 시 SNI를 지원하지 않는 점으로 인해 SSL Virtual Host에서 Apache bug와 동일한 동작이 발생한다.
다만, NZ 구현에 따르면,
즉. Wilcard 인증서를 보안에 취약한 것을 근거로 들며 SNI 를 지원하지 않는 OHS 에서는 (Name-based 를 지원하지 않음)
다음과 같이 구성하는 것을 권장한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Listen x.x.x.x:443
Listen y.y.y.y:443
<VirtualHost x.x.x.x:443>
<IfModule ossl_module>
SSLProtocol TLSv1.2
...
<VirtualHost y.y.y.y:443>
<IfModule ossl_module>
SSLProtocol TLSv1.1
...
x.x.x.x
와 y.y.y.y
으로 서로 다른 Listner 를 구현하므로, NZ Wallet이 서로 다르게 적용될 수 있고 SSL/TLS Protocol set 또한 개별적으로 적용될 수 있다는 것이다.
그러므로, 서로 다른 SSLProtocol 를 적용 받게 된다.
또는 Port를 여러개 두어, Port-based Virtual Host로 구성할 수도 있다.
5. References
Support Status for Wildcard, SNI and SAN SSL Certificates for Oracle HTTP Server and Web Cache 11g/12c (Doc ID 2225494.1)
Using SAN Certificates with Oracle HTTP Server
Oracle HTTP Server 12c 에서 VirtualHost 별 다른 SSLProtocol 지정 방법 (Doc ID 2999590.1)