키워드 요약 설명
* SSL (Secure Sockets Layer)
인터넷 통신에서 데이터를 암호화하여 안전하게 전송하는 프로토콜. SSL은 TLS로 대체되었으며, 현재는 더 이상 사용되지 않음.
* TLS (Transport Layer Security)
SSL의 후속 버전으로 더 안전하고 효율적인 암호화 프로토콜.
적용 환경
버전 : Amazon Linux release 2023.5.20240722 (Amazon Linux)
Python기반의 웹 애플리케이션 프레임워크인 'Reflex'를 AWS에 셀프호스팅을 진행중이다.
Reflex 소스코드를 받아 환경설정을 하고 production모드 실행까지 성공했으나, https 적용을 위해 TLS를 적용해야 하는 단계.
Reflex에서 직접 https를 다룰 수 있는 기능은 없으며, reverse proxy구조를 이용하여 Nginx를 거쳐서 인증하도록 해야한다.
nginx 설치
sudo yum install nginx
Nginx 설치 후 설정 진행
Nginx 명령어
sudo systemctl start nginx // 실행
sudo systemctl status nginx // 상태 조회
sudo systemctl stop nginx // 중지
Nginx 설정파일 경로 : /etc/nginx/nginx.conf
* /etc/nginx/nginx.conf 파일에 오류가 있다면 아래 메시지 발생
Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xeu nginx.service" for details.
EPEL, Certbot 설치
아마존(AMI3)의 보안정책이 바뀌면서 amazone linux에서는 certbot만 설치 하지 못하고 nginx를 이용해서 설치해야 한다.
인증서 구조
Browser <-- HTTPS --> Nginx <-- HTTP --> Reflex App
시스템 종속성 설치
sudo dnf install python3 augeas-libs
가상환경 설정
sudo python3 -m venv /opt/certbot/
sudo /opt/certbot/bin/pip install --upgrade pip
Certbot그리고 Certbot Nginx 플러그인 을 가상환경에 설치
/opt/certbot/bin/pip install certbot certbot-nginx
certbot을 이용해서 nginx에 SSL 인증서를 적용
/etc/nginx/nginx.conf 수정
server {
listen 80;
# 구입한 도메인 이름을 기입한다. ex) www.localstorybe.site
server_name my.domain.com;
# 기본 경로에 대해 localhost:3000으로 프록시
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /_next/webpack-hmr {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-Proto $scheme;
}
# /_event 경로에 대해 localhost:8000으로 프록시
location /_event {
proxy_pass http://localhost:8000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
체크리스트
1)웹서버 실행 종료 확인
2)80번 포트 사용중 확인
3)80번 포트 포트포워딩 해제(필자는 포트포워딩 중이었음)
- iptables -t nat -L --line-numbers -v -n
- sudo iptables -t nat -D PREROUTING <규칙 번호>
sudo certbot certonly --standalone
추가 정보
인증서 경로 : /etc/letsencrypt/live/cookeng.site
인증서 자동 갱신
TLS 인증서는 90일동안만 유효하기 때문에 이후 재발급을 진행해야 한다.
crontab을 통해 인증서 재발급을 자동화 하자.
crontab 설치
sudo yum install cronie -y
cronie 서비스 활성화
sudo systemctl start crond
sudo systemctl enable crond
crontab 편집
crontab -e
인증서 갱신 스케줄 추가
service nginx stop
sudo certbot renew
인증서 재발급
sudo certbot --nginx -d example.com
참고 자료
1) https://certbot.eff.org/instructions?ws=other&os=pip