지석이의 일기
Nginx에 https 을 연결 - letsencrypt 본문
이전 시간에 nginx과 tomcat 을 연계하는 기능을 배웠다.
nginx가 WEB서버 역활을 하고, tomcat 이 WAS 역활을 한다.
그런데 http가 아닌 https를 이용한다면 WEB서버에 추가 작업을 해줘야한다.
1. https 란 쉽게 말해서 SSL/TLS 통신 (Secure Socket Layer/Transport Layer Security) 라고 한다.
SSL은 인터넷 기반 암호화 프로토콜이라고 하는데, 말은 거창하지만 쉽게 말해서
클라이언트 => 서버 간의 요청 통신 중 암호화해서 서버로 데이터를 넘기는 방식이다.
당연히 서버에서는 해당 통신을 복호화해서 데이터를 수령받아 요청을 처리한다.
이러는 이유는 클라이언트 => 서버 간의 통신중 중간에 통신을 하이젝킹? 가로채는 해킹이 있다고 한다.
암호화가 되어있으면 통신을 가로챈다 한들 사용하지 못할것이다.
예시로, 아이디 및 패스워드로 로그인하는 과정에 HTTP통신의 경우 데이터에 모든 데이터가 검색된다.
http는 검색 조차 되지 않는다...
그럼 지금부터 nginx WEB서버에 https을 연계하는 방법을 알아보자.
https을 연결하기 전에 먼저 준비되어야하는것이 다음의 2개이다.
1. web 서버 : 당연히 이전시간에 nginx WEB서버를 설치했으니 패스
2. 도메인 : nginx 을 연결을 했다면 기본적으로 본인만의 도메인을 가졌을 테니 패스
다음 2개가 존재한다는 과정하에 시작하자.
우선 https 발행 기관은 여러개가 있겠지만 필자는 Let's Encrypt 로, SSL을 무료로 발급해주는 기관이다.
대신 유효기간이 90일이다.
2. https 서버 설치
서버에 SSL 인증 관리 툴 certbot 을 설치하자.
certbot은 해당 서버에 SSL을 관리하는 여러가지 기능을 제공한다.
sudo yum install certbot
sudo yum install python2-certbot-nginx
이후 나오는 것들은 전부 Y로 시작하고, 이제 남은것은 도메인 인증을 하면되는데
인증 방법은 4가지이다 .
- webroot 방법: 특정 사이트 디렉토리 내에 특정 파일을 업로드하는 방법
- 웹서버에 직접 파일 업로드 : 인증서에 필요한 파일들을 직접 올리는 방법
- Standalone 방법 : http로 특정 파일 혹은 특정 url을 구동시키기
- DNS : 메인을 쿼리해 확인되는 TXT 레코드로 사이트 유효성을 확인하는 방법
물론 1번 webroot로 한다.
해당 도메인에 \.well-known/acme-challenge/로 접근이 가능하면 된다.
이전 단에 배운 tomcat.conf 에 넣어주자
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
이후 certbot에 어느 도메인을 등록할지 설정해준다.
sudo certbot --nginx -d testdomain.co.kr
따로 경로 설정을 하지 않았다면 /etc/letsencrypt/live/ 경로에 존재한다.
server {
server_name testdomain.co.kr;
location / {
# 80포트로 접속한 경우 로컬 8080 포트로 넘김
proxy_pass http://testdomain.co.kr:8080;
# 넘겨받을 때의 버전을 지정
proxy_http_version 1.1;
# 넘겨받을 때의 헤더 정보를 지정
# 호스트 명
proxy_set_header Host $host;
# 클라이언트가 Host 헤더로 넘기는 오리지널 호스트명
proxy_set_header X_Forwarded-Host $host;
# 프록시 서버의 호스트명
proxy_set_header X-Forwarded-Server $host;
# proxy 서버의 IP가 아닌, 실제 클라이언트이 IP정보
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy 에서 요청할때 사용하는 프로토콜 정보 (http or https)
proxy_set_header X-Forwarded-Proto $scheme;
}
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/testdomain.co.kr/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/testdomain.co.kr/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = testdomain.co.kr) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name testdomain.co.kr;
return 404; # managed by Certbot
}
tomcat.conf 을 수정해주되, 아래쪽보면 강제 433으로 전환하는 소스까지 있다.
수정 뒤, nginx 재부팅하면 된다.
sudo systemctl restrat nginx
정상적으로 된다면 주기적으로 인증서를 재갱신 할 수 있게 주기적으로 재갱신할수있도록한다.
sudo crontab -e 로 켜서
0 0 * * * sudo certbot renew
넣어주면 된다. 해당 인증서는 만료되기 1달 전(재발생 60일 이후) 부터 갱신 가능 하므로 crontab으로 매월 매일 재갱신하도록 한다.
'Server' 카테고리의 다른 글
React 프로젝트 클라우드 서버에 배포 (1) | 2024.03.17 |
---|---|
AWS EC2에서 Redis 설치하고 Spring Boot에서 사용하기 (0) | 2024.01.15 |
하나의 리눅스 서버에 WEB서버를 추가해보자 (nginx) + 8080포트 tomcat (0) | 2023.05.11 |
AWS에 나만의 계정을 만들어보자. 키페어 (.pem)없이 접속하는 계정 만들기 (0) | 2021.06.06 |
AWS를 이용해서 서버를 호스팅(Host)하자. (1) | 2021.06.06 |