
발단
Https 적용은 프론트 기능 구현까지 모두 완료 후에 백엔드-프론트엔드 동시에 진행하려고 했던 작업이다. 하지만 백엔드가 먼저 해야만 했다. 왜냐하면 ... 더보기
https://un-lazy-midnight.tistory.com/171
[해결] 쿠키가 브라우저에 저장 되지 않는 Chrome SameSite 이슈 (Set-Cookie 동작 안 함)
바야흐로 7월 말.. 백엔드 리팩토링과 테스트 코드를 작성하고 있던 나에게 성큼 다가온 이슈... 브라우저에서 쿠키가 저장되지 않음 . . . 프론트엔드와 개발을 구분해서 하고있기 때문에 API 구
un-lazy-midnight.tistory.com
프론트에서 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/
SSL Server Test (Powered by Qualys SSL Labs)
SSL Server Test This free online service performs a deep analysis of the configuration of any SSL web server on the public Internet. Please note that the information you submit here is used only to provide you the service. We don't use the domain names or
www.ssllabs.com
성공 화면

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
AWS에 Let's Encrypt로 HTTPS 적용하기
1. HTTP vs HTTPS ? 1) HTTP(Hypertext Transfer Protocol) 클라이언트와 서버 양쪽에서 통신할 수 있도록 하는 기본 통신 프로토콜입니다. 앞서 웹서버 HTTP 프로토콜의 포트인 80번 포트로 접속하도록 설정을 하
king-ja.tistory.com
https://velog.io/@boo105/SpringBoot에-SSL-인증서를-적용해보자
SpringBoot에 SSL 인증서를 적용해보자 (feat. AWS EC2)
SSL, HTTPS, SpringBoot
velog.io
'💻dev > 🕹️Project' 카테고리의 다른 글

발단
Https 적용은 프론트 기능 구현까지 모두 완료 후에 백엔드-프론트엔드 동시에 진행하려고 했던 작업이다. 하지만 백엔드가 먼저 해야만 했다. 왜냐하면 ... 더보기
https://un-lazy-midnight.tistory.com/171
[해결] 쿠키가 브라우저에 저장 되지 않는 Chrome SameSite 이슈 (Set-Cookie 동작 안 함)
바야흐로 7월 말.. 백엔드 리팩토링과 테스트 코드를 작성하고 있던 나에게 성큼 다가온 이슈... 브라우저에서 쿠키가 저장되지 않음 . . . 프론트엔드와 개발을 구분해서 하고있기 때문에 API 구
un-lazy-midnight.tistory.com
프론트에서 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/
SSL Server Test (Powered by Qualys SSL Labs)
SSL Server Test This free online service performs a deep analysis of the configuration of any SSL web server on the public Internet. Please note that the information you submit here is used only to provide you the service. We don't use the domain names or
www.ssllabs.com
성공 화면

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
AWS에 Let's Encrypt로 HTTPS 적용하기
1. HTTP vs HTTPS ? 1) HTTP(Hypertext Transfer Protocol) 클라이언트와 서버 양쪽에서 통신할 수 있도록 하는 기본 통신 프로토콜입니다. 앞서 웹서버 HTTP 프로토콜의 포트인 80번 포트로 접속하도록 설정을 하
king-ja.tistory.com
https://velog.io/@boo105/SpringBoot에-SSL-인증서를-적용해보자
SpringBoot에 SSL 인증서를 적용해보자 (feat. AWS EC2)
SSL, HTTPS, SpringBoot
velog.io