2025년 4월 15일 화요일

아파치 웹서버에 여러SSL(SNI) 설정하는 방법

아파치 웹서버에 SNI 설정하는 방법

SNI(Server Name Indication)란?

SNI(Server Name Indication)는 TLS 프로토콜의 확장 기능으로, 클라이언트가 서버에 HTTPS 연결을 시도할 때 접속하려는 호스트 이름을 TLS 핸드셰이크 과정 초기에 서버에 알려주는 기술입니다. 이를 통해 하나의 IP 주소와 포트(일반적으로 443)에서 여러 도메인의 SSL/TLS 인증서를 호스팅할 수 있게 됩니다.

사전 요구사항

아파치 웹서버에서 SNI를 사용하기 위해서는 다음 조건이 필요합니다:

  1. Apache 2.2.12 이상 버전
  2. OpenSSL 0.9.8f 이상 버전
  3. 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

주의사항

  1. SNI 클라이언트 호환성: 구형 브라우저 및 운영체제(Windows XP의 IE 등)는 SNI를 지원하지 않습니다. 대부분의 최신 브라우저는 SNI를 지원합니다.

  2. 첫 번째 VirtualHost의 중요성: SNI 요청이 없거나 일치하는 ServerName이 없을 경우, 아파치는 첫 번째 VirtualHost의 SSL 인증서를 사용합니다. 따라서 첫 번째 VirtualHost는 가장 일반적인 또는 기본 도메인으로 설정하는 것이 좋습니다.

  3. 인증서 유효성: 각 VirtualHost에 설정된 ServerName과 인증서의 CN(Common Name) 또는 SAN(Subject Alternative Name)이 일치해야 합니다.

  4. 오류 로깅: 설정 후 웹서버 로그를 확인하여 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 도메인을 호스팅할 수 있게 됩니다.

댓글 없음:

댓글 쓰기

구글 I/O 2025: 이론이 현실이 되다

  구글 I/O 2025: 이론이 현실이 되다 2025년 5월 20일, 미국 캘리포니아 마운틴뷰에서 개최된 구글 I/O 2025는 인공지능 기술의 놀라운 발전과 이를 통한 현실 세계의 변화를 보여주는 무대였습니다. 순다 피차이 구글 CEO가 이끈 이번...