본문 바로가기
Spring

스프링부트 EC2 - 도메인 적용 & https 적용 -> 무료 인증서 & 인증서 발급 자동화까지

by 지식을 쌓는 개구리 2024. 8. 10.

여는 글

이전 스프링부트 프로젝트 안전하게 배포하는 블로그 포스팅에 이어 마지막으로 스프링부트 프로젝트에 우리가 구매한 도메인을 어떻게 적용하는지, https적용을 어떻게 진행하는지 기록하려고 한다.

추가로 Let’s Encrypt라는 무료 공인 ssl인증서를 발급받아 https를 적용할 것이며 이 인증서는 발급받은 시점에서 3개월만 유효하기에

3개월마다 자동으로 인증서를 발급하는 설정까지 진행하여 실 서비스 운영을 진행하는데 관리와 부담이 없을 수 있게 진행할 예정이다.

 

혹시 스프링부트 프로젝트 배포를 진행하지 않았다면, 이전에 작성해 두었던 블로그인 스프링부트 EC2 배포 블로그를 따라 진행한 뒤 이 포스팅의 과정을 이어서 진행하면 된다.

https://choiet.tistory.com/67

 

스프링부트 EC2 배포 종결 + EC2 스왑적용으로 안전하게 build

여는 글멋쟁이사자처럼 해커톤을 준비하면서 스프링부트 프로젝트를 ec2-리눅스, 우분투 환경에서 여러번 & 다양한 방식으로 배포하다가가장 효율적이고, 안정적이며 쉽게 배포할 수 있는 방법

choiet.tistory.com

=> 스프링부트 배포가 선 진행된 후 도메인+https적용을 진행해야 한다.

 

위 게시글의 필자의 배포 방식이 아니더라도 EC2에 프로젝트 배포가 완료된 상태라면 아래 과정을 그대로 진행해도 무방하다.

도메인 구매 및 적용 & https를 어떻게 적용하는지 간략하고 쉽게 알아보자.

 

 

1. 도메인 구매 및 호스팅 영역 설정

가장 먼저 진행되어야 할 것은 도메인의 구매와 호스팅 영역 설정이다.

기본적으로 https적용을 진행하려면 우리가 흔히 아는 도메인(ex. naver.com, google.com)을 적용해야 한다.

대부분의 공인 인증서 발급 기관의 경우 도메인이 적용된 url에 대해서만 ssl인증서를 발급한다.

=> 신뢰성의 문제,, SSL 인증서는 웹사이트가 주장하는 도메인의 실제 소유자임을 증명하는 디지털 서명이기에 도메인이 없다면 웹사이트의 소유자가 누구인지 확인할 방법이 없어, 인증 기관이 신뢰할 수 없는 사이트에 인증서를 발급할 가능성이 존재한다.

 

물론 꼭 도메인을 적용하지 않아도 https적용이 가능한 방법이 존재한다.=> 그런데,,, 우회하는 설정이 필요하거나, 무료로 발급할 수 없고 금액을 더 지불해야 한다거나, 개인 ssl인증서를 발급받을 수도 있지만 안전하지 않은 웹 사이트로 인증되어 통신이 안되거나, aws의 로드밸런서와 같이 비싼 서비스를 이용하는 방법밖에 없기에.. 편한 방법으로는 도메인을 구매하여 적용하는 것이 가장 좋은 방법.

 

그럼 도메인 구매 및 호스팅 영역 설정까지 진행해 보자=> 도메인 구매와 호스팅 영역 설정의 경우 이전에 블로그 게시글로 작성해 두었기에 아래의 게시글을 따라 진행하고 돌아오자

 

시작하기에 앞서 도메인 구매 방법에 대해서는 2가지의 방법이 존재한다. (중요)

[1. AWS-Route53에서 도메인 구매 및 설정]

=> 도메인 구매를 AWS의 서비스인 Route53에서 구매하는 방식이다.

도메인 url은 .com으로 진행할 수 있으며 가격은 "1년간 14$"이다.

장점: 결제가 AWS 청구서로 다른 서비스 이용내역들과 한 번에 관리되기에 관리에 있어 매우 편하다. + 과정이 깔끔하다.

단점: 가비아처럼 첫 1년 무료, 이런 혜택은 없다.

 

[2. 가비아에서 500원으로 저렴하게 도메인 구매 및 설정]

=> 도메인 구매를 가비아에서 구매하여 관련 설정을 한다.

도메인 url은 .shop or .store로만 진행할 수 있지만 가격이 첫 1년 동안 550원이다. 이후 "1년간 5만원+-@"

장점: 첫 1년은 550원이기에 테스트 혹은 한 번쯤 연습용으로 무방하다.

단점: 첫 1년 이후로는 1년간 5만 원 정도의 비용이 발생한다.

 

각각 장단점이 있다. 어떤 방법으로든 진행해도 무방하다.

본인이 연습용으로 테스트의 용도로 https를 적용할 것이라면 저렴한 가비아를 이용하면 될 것이고

본인이 앞으로 실제 서비스를 진행할, 오랜 기간 운영의 의사가 있다면 AWS-Route53으로 진행하면 될 것이다.

 

"2개 중에 하나의 방법을 본인이 선택해서 진행하면 된다."

 

 

[1. AWS-Route53에서 도메인 구매 및 설정]

https://choiet.tistory.com/55

 

EC2 서비스에 도메인 구매 & 적용까지 + https 적용까지 간단하게

여는 글1년 전에 프로젝트를 진행하면서 정리해야지,, 했던 도메인 등록과 구매 & 적용과정을 이제서야 블로그 포스팅으로 정리한다.해당 글을 따라가면 AWS Route53 서비스에서 도메인 구매부터 ec

choiet.tistory.com

=>  "1. Route53에서 도메인 구매"~ "2. 레코드 생성" 까지만 따라서 진행하고 이 글로 돌아오면 된다. 이후론 DJango 프로젝트에 적용하는 과정이기 때문.

 

[2. 가비아에서 500원으로 저렴하게 도메인 구매 및 설정]

https://choiet.tistory.com/69

 

가비아에서 500원에 도메인 구매후 EC2 프로젝트에 적용하기

여는 글이전까지는 스프링부트 & 장고 프로젝트에 도메인을 적용할 때 늘 AWS-Route53 서비스를 통해 도메인을 구매하고적용하였었다. 하지만 Route53은 연간 14$로 우리나라 돈으로 2만원정도의 과금

choiet.tistory.com

=> "1. 가비아에서 도메인 구매" ~ "2. AWS - Route53에서 도메인 등록 및 설정" 까지만 따라서 진행하고 이 글로 돌아오면 된다.

 

 

2. Let’s Encrypt로 https 적용 & ssl 인증서 발급 자동화

Let’s Encrypt로 https적용을 위해 Let’s Encrypt에서 제공하는 Certbot을 설치해 인증서 발급을 진행해 보자.

=> EC2에 접속하고 진행하면 된다.

1. Certbot 설치

(루트 경로에서 진행해야 함. cd ~/ 를 입력하면 루트 경로)

sudo apt update
sudo apt install certbot

=> 다음 명령어로 Certbot을 설치하자.

 

혹시 설치가 중간에 진행되지 않았다면 아래 명령어로 업데이트를 모두 진행 후 다시 시도하면 된다.

sudo apt-get update
sudo apt-get upgrade

=> 오류가 발생했을 경우에만 -> (보라색 화면이 뜬다면 그냥 엔터 하면 된다. 업데이트 진행을 했기에 재시작이 필요한 것)

 

2. 인증서 발급

sudo certbot certonly --standalone -d 본인도메인명.com -d www.본인도메인명.com

=> 이제 도메인을 위한 SSL 인증서를 발급받는 과정이다. -> 다음 명령어를 실행해 standalone 모드로 인증서를 생성한다.

=> 성공하면 인증서와 관련된 파일들이 /etc/letsencrypt/live/본인도메인명.com/ 경로에 저장된다.

=> 진행할 때는 꼭 위 "본인도메인명"에 자신의 도메인명을 정확히 입력 후 진행해야 한다.

=> 진행 중 "Y"를 입력하라거나 "email"을 입력하라는 메시지가 뜬다. 잘 입력하고 엔터 하면 된다.

[오류 발생 시]

"the domain's nameservers may be malfunctioning; DNS problem: SERVFAIL looking up AAAA" -> 이런 오류가 뜰 수 있다.

=> 이는 도메인 설정을 변경한 후 변경 사항이 전 세계의 DNS 서버에 전파되기까지 시간이 걸리기 때문에 발생하는 문제로,, 이 과정에서 일시적으로 DNS 조회가 실패할 수 있다.

AWS-Route에서 도메인을 구매했다면 짧으면 5분만에 가능하나,

본인이 가비아에서 진행하고 해당 내용을 따라 진행한다면 짧게는 30분 길게는 몇시간 기다렸다가 위 인증서 발급 과정을 진행하면된다.

 

3. Keystore 파일 생성

장고와 같은 경우는 nginx를 사용하기에 설정이 바로 가능하지만,, 스프링부트에서 HTTPS를 사용하려면 인증서 파일을 PKCS12 형식의 keystore 파일로 변환한 뒤 사용해야 한다. 다음 명령어로 스프링부트에서 사용할 인증서 파일을 생성하자.

sudo openssl pkcs12 -export -in /etc/letsencrypt/live/본인도메인명.com/fullchain.pem -inkey /etc/letsencrypt/live/본인도메인명.com/privkey.pem -out /etc/letsencrypt/live/본인도메인명.com/keystore.p12 -name tomcat -CAfile /etc/letsencrypt/live/본인도메인명.com/chain.pem -caname root

=> "본인도메인명"을 정확하게! 입력하고 진행하자..

=> 진행 중 다음과 같이 pw를 입력하라고 출력된다. 이 pw는 추후 application.propertise or yml파일에 그대로 넣어줘야 하기에 절대로 잊어버리면 안 된다. -> 기록해 두자.

 

4. Keystore 파일 복사

이제 위 3번 과정으로 스프링부트에서 사용할 변환한 인증서 파일을 생성하였다. 이제 이 생성한 인증서 파일을 스프링부트 프로젝트의 리소스 폴더로 복사하여 넣어줄 것이다.

=> 다음과 같이 프로젝트 구조를 보면 resources폴더 안에 application.properties 또는 application.yml파일이 존재한다.

프로젝트를 빌드할고 실행할 때 이 application.properties설정에서 이 인증서 키를 참고하여 작동할 수 있게 하기 위해서이 resources폴더안에 application.properties와 같은 경로에 우리가 위에서 생성한 인증서 파일을 복사해 넣어주는 것이다.

 

sudo cp /etc/letsencrypt/live/본인도메인이름.com/keystore.p12 /home/ubuntu/프로젝트 레포지토리 명/src/main/resources/

=> 다음과 같이 명령어를 입력해 keystore.p12 파일을 우리의 프로젝트 파일의 resources폴더 경로에 복사시키면 된다.

=>  keystore.p12 뒤에 붙는 경로는 본인 프로젝트 경로의 src > main > resources/이다. 경로를 잘 작성해주어야 한다. 헷갈리면 직접 cd 명령어로 들어가 보기

=> 이후 아래 사진과 같이 resources폴더 경로로 들어가 ll 명령어로 프로젝트 구조를 확인했을 때 키파일이 있으면 성공이다.

 

5. 스프링부트 설정

application.properties 설정을 추가해 주면 끝이다.

vi application.properties

=> 위 사진의 경로처럼 resources 경로로 들어가 vi application.properties 를 입력하고 엔터 한다.

=> i 를 입력해 인서트 모드로 변경하고

 

server.port=8443
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-password=인증서 발급때 본인이 설정한 pw
server.ssl.keyStoreType=PKCS12
server.ssl.keyAlias=tomcat

=> 위 내용을 복사해 파일 상단에 복사 붙여 넣기를 진행해 주자 (이동은 화살표키로)

=> 패스워드 부분에는 꼭! 인증서 발급 때 본인이 설정한 pw를 넣어줘야 한다.

=> 다 작성했으면 esc키를 누르고 :wq 를 입력 후 엔터하여 저장하고 끄기

 

sudo chown ubuntu:ubuntu /home/ubuntu/Back-End/ATC/src/main/resources/keystore.p12
sudo chmod 644 /home/ubuntu/Back-End/ATC/src/main/resources/keystore.p12

=> 그 후 키파일에 대해 잘 접근할 수 있게 위 명령어를 입력해 권한을 설정해 주자

 

5. ssl 인증서 발급 자동화

마지막으로 위에서 설명했듯 ssl인증서는 발급 후 3개월만 유효하기 때문에

아래 명령어를 입력하여 인증서 발급 자동화를 진행해 주자

-> Certbot은 기본적으로 인증서 갱신을 자동화하는 기능을 제공한다.

sudo certbot renew --dry-run

=> 다음의 명령어로.. 자동화 설정

=> 다음과 같이 화면이 뜨면 성공

=> 별도의 설정이 필요하지 않으며 앞으로 인증서 만료 전에 자동으로 갱신된다.

 

6. 프로젝트를 다시 build

=> 이제 설정이 모두 끝났으니 변경된 설정을 기반으로 다시 스프링부트 프로젝트를 build하면 된다.

=> 재 빌드의 경우 이미 작성한 배포 블로그 게시글을 따라가면 됨.

https://choiet.tistory.com/67

 

스프링부트 EC2 배포 종결 + EC2 스왑적용으로 안전하게 build

여는 글멋쟁이사자처럼 해커톤을 준비하면서 스프링부트 프로젝트를 ec2-리눅스, 우분투 환경에서 여러번 & 다양한 방식으로 배포하다가가장 효율적이고, 안정적이며 쉽게 배포할 수 있는 방법

choiet.tistory.com

=> "3. 깃허브 레포 다운 & java설치 & 프로젝트 빌드"의 5. jar build~6. 빌드파일 실행 부분까지만 진행하면 된다.

 

3. EC2 보안그룹 인바운드 규칙 https 추가

이후 마지막 과정인 https규칙을 추가해 주자.ec2 > 인스턴스 클릭 > 하단 보안 탭 클릭 > 보안그룹 클릭 > 인바운드 규칙 클릭 > 규칙 추가

 

[최종 전체 인바운드 규칙]

=> https로 접근 허용을 위해 다음과 같이 EC2에 인바운드 규칙 편집에서 https 선택, 0.0.0.0/0 선택으로 규칙 추가를 해주자.

=> 추가로 사용자 지정 TCP를 선택 후 포트범위에 8443을 입력하고 0.0.0.0/0을 선택하여 규칙 추가를 해주자

 

 

결과

https://asyouwork.com:8443

=> 다음과 같이 https://본인도메인주소.com:8443  으로 들어가면 아래와 같이 화면이 뜨면 성공 -> 아무 설정을 하지 않았기에 이게 정상 (혹시 아래의 화면이 뜨지 않아도 api테스트를 진행해보자.)

 

 

[API호출 테스트]

=> 다음과 같이 https를 적용한 도메인 주소로 api호출도 잘 진행되는 것을 확인할 수 있다!

 

 

느낀 점 및 글을 마치며

[느낀 점]

멋쟁이사자처럼 해커톤을 진행하면서 급박하게 도메인 적용과 https적용을 진행하였는데, 이를 다시 잘 기록하고 블로그로 작성하면서 다시 실습하며 과정을 자세히 이해할 수 있어서 좋았다. 파이썬 기반의 Django와는 다른 과정이 적용되었는데 스프링부트가 확실히 무겁지만 배포하고 관리하고 다루기에는 편하다는 생각이 들었다.

도메인의 적용과 그 원리와 DNS의 작동방식에 대해 공부할 수 있었으며, https 적용 과정을 통해 공인 인증서 발급 기관과 발급 원리와 사용 방법에 대해 알았고 http방식으로 서비스 운영이 매우 위험하고 취약하다는 사실을 알게 되었다. -> 스푸핑의 위험 & 패킷 도난 등,,

 

[마치며]

위 배포방식과 도메인의 적용 & https의 적용 과정에서 분명 더 좋은 방법이 있을 수도 있고

혹시나 비효율적으로 진행한 부분도 있을 수 있습니다.

이러한 부분에 대해서 문제가 있거나 더 좋은 진행방향에 대한 피드백을 댓글로 알려주시면 테스트하고 글을 수정하여 반영해 두겠습니다.