태그 보관물: openssl

아파치 https 구성

개요

Apache에서 HTTPS 구성을 위해 mod_ssl 모듈을 설치하고 OpenSSL로 Self-Signed 인증서를 생성한 후, ssl.conf와 httpd.conf에 적용하는 방법을 정리합니다. 실제 서비스에서는 공인 CA(Let’s Encrypt 등)의 인증서 사용을 권장하지만, 내부망이나 테스트 환경에서는 Self-Signed 인증서로 HTTPS를 빠르게 구성할 수 있습니다.

※ CentOS 6.x 기준으로 작성된 내용입니다. 아파치를 컴파일로 설치했을 경우 mod_ssl도 다시 컴파일로 설치를 진행해야 합니다.

HTTPS 구성 원리

HTTPS는 HTTP 통신을 TLS(Transport Layer Security)로 암호화하는 프로토콜입니다. 서버는 인증서(.crt)와 개인키(.key)를 보유하며, 클라이언트가 접속하면 TLS 핸드셰이크를 통해 인증서를 교환하고 세션 키를 협상합니다. Self-Signed 인증서는 서버 자신이 서명하므로 브라우저 신뢰 저장소에 없어 경고가 뜨지만, 내부망 서비스 암호화에는 충분합니다.

Apache에서 HTTPS를 구성하려면 mod_ssl 모듈이 필요합니다. CentOS/RHEL에서는 yum으로 설치하며, 컴파일 설치 방식의 Apache라면 --enable-ssl 옵션을 포함해 재컴파일해야 합니다. 설치 후 /etc/httpd/conf.d/ssl.conf 파일이 생성되며 이 파일에서 인증서 경로와 TLS 버전을 제어합니다.

mod_ssl, openssl 설치

mod_ssl과 openssl이 설치되어 있지 않다면 yum으로 설치합니다.

# 설치 여부 확인
# rpm -qa | grep -E "mod_ssl|openssl"

# yum install mod_ssl openssl -y

Self-Signed 인증서 생성

OpenSSL 명령으로 개인키(ca.key), CSR(ca.csr), Self-Signed 인증서(ca.crt)를 순서대로 생성한 후 Apache가 참조하는 경로에 복사합니다.

# 개인키 생성
# openssl genrsa -out ca.key 1024

# CSR(Certificate Signing Request) 생성
# openssl req -new -key ca.key -out ca.csr
# 국가/주(도)/시/사명//도메인(hostname)/// 영문으로 각 항목 입력

# Self-Signed 인증서 생성 (유효기간 10년)
# openssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca.crt

# 생성 키 복사
# cp ca.crt /etc/pki/tls/certs/
# cp ca.key /etc/pki/tls/private/ca.key
# cp ca.csr /etc/pki/tls/private/ca.csr

# SELinux 활성화 환경에서 컨텍스트 복구 필요 시
# restorecon -RvF /etc/pki

ssl.conf 설정

/etc/httpd/conf.d/ssl.conf에서 인증서 파일 경로를 생성한 파일 경로로 수정합니다.

# /etc/httpd/conf.d/ssl.conf 수정 — 경로 및 파일명 수정
SSLCertificateFile /etc/pki/tls/certs/ca.crt
SSLCertificateKeyFile /etc/pki/tls/private/ca.key

httpd.conf 설정

HTTPS VirtualHost를 추가하고 HTTP 요청을 HTTPS로 리다이렉트하는 rewrite 규칙을 설정합니다. Apache 2.4에서는 NameVirtualHost 지시자가 불필요합니다.

# /etc/httpd/conf/httpd.conf에 추가
# NameVirtualHost *:443  <-- Apache 2.4에서는 삭제
<VirtualHost *:443>
  SSLEngine on
  SSLCertificateFile /etc/pki/tls/certs/ca.crt
  SSLCertificateKeyFile /etc/pki/tls/private/ca.key
  ServerAdmin admin@<domain>
  DocumentRoot /var/www/html
  ServerName <domain>
  ErrorLog logs/ssl_error_log
  CustomLog logs/ssl_access_log common
</VirtualHost>

# HTTP → HTTPS 리다이렉트 (mod_rewrite 활성화 필요)
<VirtualHost *:80>
  RewriteEngine On
  RewriteCond %{HTTPS} !=on
  RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
</VirtualHost>

서비스 재시작 및 확인

Apache를 재시작한 후 80/443 포트 리슨 상태를 확인하고, 브라우저에서 HTTP 접속 시 HTTPS로 리다이렉션되는지 확인합니다.

# CentOS 6.x
# service httpd restart

# CentOS 7.x
# systemctl restart httpd

# 80, 443 포트 리슨 확인
# netstat -ntlp

# 브라우저에서 http://<서버IP> 접속 후 https로 리다이렉션 여부 확인

Self-Signed 인증서 한계와 공인 인증서 전환

Self-Signed 인증서는 브라우저에서 “신뢰할 수 없는 인증서” 경고를 표시합니다. 사용자가 직접 예외를 추가해야 하며, 모바일 브라우저나 API 클라이언트에서는 연결 자체가 거부되기도 합니다. 외부 사용자가 접근하는 서비스라면 Let’s Encrypt 등 공인 CA에서 무료 인증서를 발급받아 적용하는 것이 권장됩니다.

현재 적용된 인증서 유효기간과 발급자는 OpenSSL 명령으로 확인합니다.

# 도메인 인증서 정보 확인 (원격)
openssl s_client -connect <domain>:443 < /dev/null 2>/dev/null | openssl x509 -noout -dates -subject

# 파일로 인증서 정보 확인
openssl x509 -in /etc/pki/tls/certs/ca.crt -noout -dates -subject

인증서 갱신 시에는 새 인증서와 키 파일을 기존 경로에 덮어쓴 뒤 systemctl reload httpd로 중단 없이 새 인증서를 반영할 수 있습니다. restart와 달리 reload는 Apache를 재시작하지 않고 설정만 다시 읽으므로 기존 연결을 끊지 않습니다.

참고

참고 문서: Apache SSL/TLS How-To 공식 문서 · OpenSSL req 명령어 문서