아파치 웹서버에 SNI 설정하는 방법
SNI(Server Name Indication)란?
SNI(Server Name Indication)는 TLS 프로토콜의 확장 기능으로, 클라이언트가 서버에 HTTPS 연결을 시도할 때 접속하려는 호스트 이름을 TLS 핸드셰이크 과정 초기에 서버에 알려주는 기술입니다. 이를 통해 하나의 IP 주소와 포트(일반적으로 443)에서 여러 도메인의 SSL/TLS 인증서를 호스팅할 수 있게 됩니다.
사전 요구사항
아파치 웹서버에서 SNI를 사용하기 위해서는 다음 조건이 필요합니다:
- Apache 2.2.12 이상 버전
- OpenSSL 0.9.8f 이상 버전
- mod_ssl 모듈이 활성화되어 있어야 함
SNI 설정 방법
1. 버전 확인
먼저 아파치와 OpenSSL 버전이 SNI를 지원하는지 확인합니다:
apache2 -v
openssl version
2. mod_ssl 모듈 활성화 확인
mod_ssl 모듈이 활성화되어 있는지 확인합니다:
apache2ctl -M | grep ssl
활성화되어 있지 않다면 아래 명령어로 활성화합니다:
a2enmod ssl
3. SSL 설정 파일 준비
Apache 설정 파일은 일반적으로 다음 위치 중 하나에 있습니다:
/etc/apache2/apache2.conf
(Debian/Ubuntu)/etc/httpd/conf/httpd.conf
(RHEL/CentOS)- 또는
/etc/apache2/conf.d/ssl.conf
또는/etc/apache2/sites-available/
디렉토리
4. VirtualHost 설정
각 도메인에 대해 별도의 VirtualHost를 설정합니다. SNI는 Apache에서 별도 설정이 필요 없이 지원되는 버전에서는 기본적으로 활성화되어 있습니다.
기본 설정 예시:
# SSL 포트 리스닝 설정
Listen 443
# 모든 IP 주소의 443 포트 수신 설정
NameVirtualHost *:443
# 첫 번째 도메인 VirtualHost 설정
<VirtualHost *:443>
DocumentRoot /var/www/site1
ServerName example.com
ServerAlias www.example.com
SSLEngine on
SSLCertificateFile /경로/example.com.crt
SSLCertificateKeyFile /경로/example.com.key
SSLCertificateChainFile /경로/chain.pem
# 추가 SSL 설정
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite HIGH:!aNULL:!MD5
# 기타 설정
ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined
</VirtualHost>
# 두 번째 도메인 VirtualHost 설정
<VirtualHost *:443>
DocumentRoot /var/www/site2
ServerName second-example.com
ServerAlias www.second-example.com
SSLEngine on
SSLCertificateFile /경로/second-example.com.crt
SSLCertificateKeyFile /경로/second-example.com.key
SSLCertificateChainFile /경로/chain.pem
# 추가 SSL 설정
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite HIGH:!aNULL:!MD5
# 기타 설정
ErrorLog ${APACHE_LOG_DIR}/second-example.com-error.log
CustomLog ${APACHE_LOG_DIR}/second-example.com-access.log combined
</VirtualHost>
5. Apache 2.4.8 이상 버전에서의 설정
Apache 2.4.8 이상에서는 SSLCertificateChainFile
지시문이 더 이상 사용되지 않으므로(deprecated), 대신 SSLCACertificateFile
지시문을 사용합니다:
<VirtualHost *:443>
ServerName example.com
SSLEngine on
SSLCertificateKeyFile /경로/example.com.key
SSLCertificateFile /경로/example.com.crt
SSLCACertificateFile /경로/root-chain-bundle.pem
# 기타 설정...
</VirtualHost>
6. 설정 테스트 및 적용
설정 파일을 수정한 후 문법 오류를 확인합니다:
apache2ctl configtest
# 또는
apachectl -t
설정이 정상이면 아파치 웹서버를 재시작합니다:
systemctl restart apache2
# 또는
service apache2 restart
# 또는
apachectl restart
주의사항
SNI 클라이언트 호환성: 구형 브라우저 및 운영체제(Windows XP의 IE 등)는 SNI를 지원하지 않습니다. 대부분의 최신 브라우저는 SNI를 지원합니다.
첫 번째 VirtualHost의 중요성: SNI 요청이 없거나 일치하는 ServerName이 없을 경우, 아파치는 첫 번째 VirtualHost의 SSL 인증서를 사용합니다. 따라서 첫 번째 VirtualHost는 가장 일반적인 또는 기본 도메인으로 설정하는 것이 좋습니다.
인증서 유효성: 각 VirtualHost에 설정된 ServerName과 인증서의 CN(Common Name) 또는 SAN(Subject Alternative Name)이 일치해야 합니다.
오류 로깅: 설정 후 웹서버 로그를 확인하여 SSL 관련 오류나 경고가 있는지 확인해야 합니다.
SNI 설정 테스트
설정이 제대로 되었는지 확인하려면 다음 명령어를 사용할 수 있습니다:
openssl s_client -connect example.com:443 -servername example.com
위 명령은 SNI 정보를 포함하여 연결을 시도하며, 서버가 올바른 인증서를 반환하는지 확인할 수 있습니다.
서버가 설정된 각 도메인에 대해 서로 다른 인증서를 반환하는지 확인하려면, 다른 도메인 이름으로도 테스트해 보세요:
openssl s_client -connect example.com:443 -servername second-example.com
이로써 아파치 웹서버에서 SNI를 사용하여 하나의 IP 주소와 포트에서 여러 SSL 도메인을 호스팅할 수 있게 됩니다.
댓글 없음:
댓글 쓰기