Overview
이 글에서는 Apache HTTP Server(이하 Apache)에 HTTPS(SSL/TLS)를 적용하는 방법을 알아본다.
HTTPS는 기존 HTTP 프로토콜을 암호화하여 보안성을 강화한 프로토콜이다.
HTTPS(Hyper Text Transfer Protocol Secure)란?
기존 HTTP(80번 포트)는 데이터를 평문(Plain text)으로 주고받기 때문에 패킷 스니핑(Packet Sniffing) 등의 공격에 취약하다.
이를 해결하기 위해 SSL/TLS 암호화를 적용한 HTTP가 HTTPS(443번 포트)이다.
HTTPS 적용 시 이점
- 데이터 암호화: 클라이언트와 서버 간 통신을 암호화하여 보안 강화
- 데이터 무결성 보장: 데이터가 변경되지 않고 그대로 유지됨
- 인증(Authentication) 지원: 인증서를 이용하여 신뢰할 수 있는 사이트임을 증명
HTTPS 구성 요소
HTTPS를 적용하기 위해서는 두 가지 필수 요소가 필요하다.
키(Key)
- 데이터를 암호화 및 복호화하는 데 사용됨
- 개인키(Private Key)와 공개키(Public Key)로 구성됨
인증서(Certificate)
- 인증 기관(CA, Certificate Authority)에서 발급받거나 자체 서명(Self-signed) 인증서를 생성하여 사용 가능
- 키를 기반으로 암호화 및 인증을 수행
Apache에 HTTPS 적용하기 (실습)
이제 Apache 서버에서 HTTPS(SSL/TLS)를 적용하는 과정을 따라가 보자.
1️⃣ Apache 및 OpenSSL 패키지 설치
먼저 Apache HTTP Server와 OpenSSL 패키지를 설치한다.
# Apache 및 OpenSSL 설치
yum -y install httpd mod_ssl openssl
# 설치 확인
rpm -qa | grep -E "httpd|openssl"
Apache와 OpenSSL이 정상적으로 설치되었는지 확인!
2️⃣ SSL 키(Key) 및 인증서(Certificate) 생성
키 생성 (Private Key)
# 키 저장 디렉터리 이동
cd /etc/pki/tls/certs/
# 개인키(Private Key) 생성 (2048비트 암호화)
openssl genrsa -out http.key 2048
`http.key` 라는 개인 키가 생성됨
인증서 서명 요청(CSR) 생성
openssl req -new -key http.key -out http.csr
위 명령어를 입력하면 도메인 및 조직 정보 입력이 필요하다.
(도메인이 없을 경우, `Common Name(CN)` 에 서버의 IP를 입력해도 무방함)
`http.csr` 이라는 CSR 파일이 생성됨
인증서 발급 및 키와 병합
openssl x509 -req -days 365 -in http.csr -signkey http.key -out http.crt
- `http.crt`: 최종적으로 생성된 SSL 인증서 파일
- `-days 365`: 1년 동안 유효한 인증서 생성
이제 키와 인증서 준비 완료!
3️⃣ SSL 모듈 활성화 및 설정 변경
Apache에 SSL 모듈이 활성화되어 있는지 확인
apachectl -M | grep ssl
`ssl_module (shared)` 가 출력되면 SSL 모듈이 활성화됨
SSL 설정 파일 편집
# SSL 설정 파일 이동
cd /etc/httpd/conf.d/
# 기존 설정 파일 백업
cp -p ssl.conf ssl.conf.backup
# SSL 설정 파일 편집
vi ssl.conf
아래 항목을 수정 및 확인
<VirtualHost _default_:443>
DocumentRoot "/var/www/html" # 기본 루트 디렉토리 설정 (59번 줄)
SSLCertificateFile /etc/pki/tls/certs/http.crt # SSL 인증서 (100번 줄)
SSLCertificateKeyFile /etc/pki/tls/certs/http.key # SSL 키 파일 (107번 줄)
</VirtualHost>
설정이 완료되었으면 저장 후 종료한다.
4️⃣ Apache 재시작 및 방화벽 설정
Apache 서비스 재시작
# Apache 데몬 재실행
systemctl restart httpd
# Apache 서비스 활성화 (부팅 시 자동 실행)
systemctl enable httpd
# Apache 서비스 상태 확인
systemctl status httpd
Apache가 정상적으로 실행 중인지 확인!
방화벽(Firewall)에서 HTTPS(443 포트) 허용
# HTTPS(443 포트) 방화벽 추가
firewall-cmd --permanent --add-port=443/tcp
# 방화벽 적용
firewall-cmd --reload
# 방화벽 설정 확인
firewall-cmd --list-ports
443 포트가 방화벽에서 허용되었는지 확인
5️⃣ HTTPS 접속 테스트
웹 브라우저에서 `https://<서버IP>` 로 접속해보자.
Self-signed 인증서이기 때문에 웹 브라우저에서 보안 경고가 나타날 수 있다!
- Chrome: 고급 설정 → 안전하지 않은 페이지로 이동 클릭
- Firefox: 고급 → 예외 추가 선택
Apache가 HTTPS(SSL)로 정상적으로 동작하면 성공!
Apache HTTPS 설정 추가 옵션
HTTP → HTTPS 자동 리디렉션 설정
HTTP로 접속하면 자동으로 HTTPS로 리디렉션되도록 설정할 수 있다.
기본 설정 파일 수정
vi /etc/httpd/conf.d/ssl.conf
다음 내용을 추가
<VirtualHost *:80>
ServerName example.com
Redirect permanent / https://example.com/
</VirtualHost>
이제 HTTP(80번 포트)로 접근 시 자동으로 HTTPS(443번 포트)로 이동된다.
무료 SSL 인증서 (Let's Encrypt) 사용하기
Self-signed 인증서 대신, Let's Encrypt 무료 SSL 인증서를 사용하면 브라우저에서 보안 경고 없이 HTTPS를 적용할 수 있다.
# EPEL 저장소 설치 (CentOS 기준)
yum install -y epel-release
# Certbot 설치
yum install -y certbot python3-certbot-apache
# Let's Encrypt SSL 인증서 발급 (도메인이 있어야 가능)
certbot --apache -d example.com
# 자동 갱신 활성화
certbot renew --dry-run
Let's Encrypt SSL 인증서로 HTTPS를 적용할 수 있다.
마무리
- Apache와 OpenSSL을 설치했다.
- SSL 키와 인증서를 생성하여 HTTPS 적용을 완료했다.
- 방화벽 설정을 통해 443 포트를 개방했다.
- 브라우저에서 HTTPS를 통해 접속하는 것을 확인했다.
- HTTP를 HTTPS로 리디렉션하는 방법을 적용했다.
- Let's Encrypt로 무료 SSL 인증서를 적용하는 방법을 배웠다.
이제 보안이 강화된 HTTPS 기반의 Apache 웹 서버를 활용할 수 있다!
Reference
https://httpd.apache.org/docs/2.4/
'Networking, Security, Protocols' 카테고리의 다른 글
DNS 레코드와 tinydns 문법 (0) | 2022.04.22 |
---|---|
Mail Server (0) | 2022.02.17 |
RSA 공개키를 이용한 SSH 접속 (0) | 2022.01.20 |
DNS(Domain Name System) (0) | 2022.01.19 |
NFS(Network File System) / auto fs(auto file system) (0) | 2022.01.18 |