발단
Https 적용은 프론트 기능 구현까지 모두 완료 후에 백엔드-프론트엔드 동시에 진행하려고 했던 작업이다. 하지만 백엔드가 먼저 해야만 했다. 왜냐하면 ... 더보기
https://un-lazy-midnight.tistory.com/171
프론트에서 Refresh Token을 담은 쿠키가 브라우저에서 자동으로 저장되지 않는 이슈가 발생했고 위의 글을 보면 알 수 있지만 크롬 정책상 https 적용이 필수 조건이 되어버렸다. 그럼 어떻게 해.. 해야지..
준비물
- EC2 인스턴스
- 도메인(가비아에서 구입 가능, .shop 도메인은 1년에 500원으로 저렴하다!)
개발 환경
- Java17, Gradle
- AWS EC2
- OS : Ubuntu 20.04.6 LTS
도메인과 EC2 연결
Route53
- 호스팅 영역 생성 -> 도메인 이름 입력
레코드 세트 생성
- EC2 IP 연결 -> 값에 EC2 Public IP를 입력
- www.도메인 을 사용하고 싶다면 레코드 이름에 www 를 입력
- 레코드를 여러개 추가해서 [도메인, www.도메인] 둘다 사용 가능
네임서버 설정
- NS유형의 레코드 4가지의 값(ns-로 시작하는 값)을 도메인 등록한 곳에서 네임 서버로 등록
- 가비아를 도메인에서 구입했기 때문에 가비아에서 등록한다.
SSL 인증서 발급
Let’s Encrypt
Let's Encrypt는 무료의 TLS/SSL 인증서를 쉽게 가져오고 설치할 수 있는 방법을 제공하는
CA(인증 기관)으로, 웹 서버에서 암호화된 HTTPS를 사용할 수 있습니다.
이러한 방법은 사용자에게 Certbot라는 소프트웨어를 제공함으로써 구현할 수 있게 합니다.
발급 방식-> standalone
- 사이트 작동을 멈추고 이 사이트의 네트워킹을 이용해 사이트 유효성을 확인해 SSL 인증서 발급
- 동시에 여러 도메인 발급 가능
- 자동갱신 가능
1. SSH로 EC2 인스턴스에 접속하여 certbot 설치
- Certbot 패키지는 Ubuntu내에 존재하지만 Certbot 개발자들이 최신 버전의 Ubuntu 소프트웨어 저장소를 기준으로 꾸준히 제공해주기 때문에 최신 버전의 저장소를 사용
$ sudo apt update
$ sudo apt upgrade
$ sudo add-apt-repository ppa:certbot/certbot
2. Cerbot의 Nginx 패키지를 설치
$ sudo apt install python-certbot-nginx
혹은
$ sudo apt install -y certbot python3-certbot-nginx
3. Nginx Configuration을 설정
$ sudo vim /etc/nginx/sites-available/default
변경 전:
server_name _;
변경 후:
server_name 구매한 도메인 이름;
변경 후 잘 되는지 테스트
$ sudo nginx -t
4. Nginx를 reload
$ sudo systemctl reload nginx
5. HTTPS에 대한 방화벽 허용 설정
$ sudo ufw status
- AWS EC2 인스턴스의 경우는 기본적으로 방화벽이 비활성화되어 있음
6. SSL 인증서 받기
- Nginx플러그인은 필요할 때마다 Nginx를 재구성하고 구성을 다시 로드
- 원하는 도메인을 지정해서 Nginx플러그인을 통해 인증서를 획득
- -d 옵션으로 도메인을 지정
$ sudo certbot --nginx -d 도메인
이메일 입력
A or a 입력
Let's Encrypt 이메일 리스트에 추가 되고 싶다면 Y를 선택
기존 HTTP 연결 요청을 HTTPS 로 자동으로 바꿔줄 것인지 선택(자동은 2)
7. 도메인 서버테스트
아래 링크를 통해 테스트를 진행합니다. 도메인을 입력해주고 Submit을 클릭합니다.
https://www.ssllabs.com/ssltest/
성공 화면
8. Certbot 자동 갱신 확인
- Let's Encrypt의 인증서는 90일 동안만 유효하므로, 90일마다 갱신
- 설치하는 과정에서 /etc/cron.d에 자동으로 갱신시켜주는 커맨드가 추가되어 있다.
- 갱신 프로세스가 잘 동작하는지 테스트를 해보고 싶다면 다음과 같은 명령어를 입력해서 테스트를 진행 -> 오류가 나오지 않으면 설정 완료
$ sudo certbot renew --dry-run
9. 발급이 성공시 /etc/letsencrypt/live/도메인 경로에 fullchain.pem 과 privkey.prem이 발급 됨
- root 계정으로 해당 경로로 이동
- .pem은 스프링부트에서 인식못하기 때문에 pem을 PKCS12 형식으로 변경
- 명령어를 실행하고 나면 비밀번호를 입력하는데 입력해주시고 꼭 기억해야한다.
- 결과물 : keystore.p12
sudo openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out keystore.p12 -name ttp -CAfile chain.pem -caname root
10. 모든 Https 관련 설정이 완료 되었으므로 Nginx의 서버를 restart
$ sudo service nginx restart
SpringBoot 세팅
Resources에 SSL 인증서 파일 넣기
- keystore.p12 파일을 resources에 넣기(FileZila 사용하여 해당 파일을 로컬로 받아왔다.)
application.yml 설정
- 비밀번호는 9번에서 PKCS12 변경할 때 사용한 비밀번호를 입력해야 한다.
CI/CD 세팅
배포 시에 keystore.p12를 copy해야하므로 ci-cd.yml을 아래와 같이 수정한다.
## copy keystore.p12
- name: Copy keystore.p12
run: |
cd ./src/main/resources
touch ./keystore.p12
echo "${{ secrets.KEYSTORE }}" | base64 --decode > ./keystore.p12
참고
https://king-ja.tistory.com/104
https://velog.io/@boo105/SpringBoot에-SSL-인증서를-적용해보자