Spring🌱

[spring boot] let's encrypt 를 활용하여 SSL 무료 인증서 발급받기 (putty, WinSCP)

전감자(◔◡◔) 2024. 10. 18. 17:48

 

웹 사이트를 만들고 배포하고 나면 이제 누구든 내 사이트에 들어와 이용 할 수 있게 됩니다

그러나 대부분의 사이트들은 http가 아닌 https 프로토콜을 사용합니다

 

 

그 이유는 무엇일까요?

 

HTTP와 HTTPS의 차이점은?

출처 입력

HTTPS는 TLS 암호화를 갖춘 HTTP입니다. HTTPS는 TLS(SSL)를 사용하여 일반 HTTP 요청과 응답을

암호화 하므로 더 안전하고 보안이 강화됩니다.

 

 

즉 HTTPS를 사용하는 웹 사이트는

사용자가 더 신뢰할 수 있습니다.

 

 

HTTPS 를 왜 굳이 사용해야할까?

출처 입력

 

단순히 보안적인 이유 때문에 사용하는 것도 있지만

프로젝트 진행 시 프론트엔드와 백엔드 간의 통신이 이루어 질 때

한 쪽만 https 이고 다른 한 쪽은 http 인 경우 mixed content 에러가 발생하게 됩니다

 

http에서 https 로 요청을 보내는 경우에는

 

<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
 

 

위의 meta 태그로 해결이 가능하지만

(http 요청을 https 요청으로 바꿔줌)

 

그 반대는 해당 태그로 해결이 불가능 하기 때문에 다른 한 쪽도 https로 적용해줄 필요가 있습니다

 

저같은 경우 프론트 측은 https 가 적용된 상태였으나 백엔드 관리자 페이지, 서버 측은 도메인도 https도 적용이 안된 상태라

프론트 도메인에 맞춰 https를 적용해야 하는 상황이었습니다.

 

 

 

Spring boot 무료 SSL 인증서 적용하기 (Let's encrypt)

출처 입력

백엔드 개발 툴 : spring boot 2.7.14

클라우드 가상환경 : ubuntu

터미널 프로그램 : putty

파일업로드 프로그램 : filezilar 또는 WinSCP

 

참고로 인증서를 발급받기 위해서는 도메인발급이 우선시 되야한다는 점 알아주세요

도메인은 gabia , 카페24 등 다양한 사이트에서 발급받으실 수 있습니다

 

1. Let's encrypt 를 통한 인증서 발급 - certbot 설치

출처 입력

 

 

Let's Encrypt: 무료로 인증서를 발급해주는 비영리 기관

Certbot: Let's Encrypt 인증서를 수동으로 발급할 수 있게 해주는 커멘드 라인 도구

 

 

sudo apt install certbot
 

 

 

2.도메인 소유권 확인

출처 입력

인증서를 받급받기 위해서는 도메인에 대한 소유권 확인을 해야합니다.

 

 

다음 코드를 통해 DNS TXT 코드를 발급 받습니다.

 

이 때 가장 주의 해야할 점은 만약 자신의 사이트를 example.com, www.example.com 의 경로로

둘 다 접속이 가능하다면 아래 처럼 두 도메인을 모두 등록해줘야 합니다

그게 아니면 와일드 카드 도메인으로 ex) *.도메인.com

등록하게 되면 모든 호스트 명에대해 인증서를 발급받을 수 있습니다

 

 

sudo certbot certonly --manual --preferred-challenges dns -d "[도메인1]" -d "[도메인2]" 
 

 

 

대표사진 삭제

사진 설명을 입력하세요.

 

그럼 위의 사진 처럼 서버에서 TXT 코드를 줍니다

TXT 코드를 자신이 도메인이 발급받은 사이트의 레코드 관리 설정에 들어가서

TXT 타입의 레코드를 생성해주고 host 명은 _acme-challenge.[소유권 확인을 원하는 서버의 호스트 명] 하여 설정해줍니다

 

대표사진 삭제

사진 설명을 입력하세요.

 

 

예를 들어 www.example.com 이면 _acme-challenge.www 라고 해야 레코드가 등록됩니다!!

저는 이걸 몰라서 한참을 해맸네요 ㅜㅜ

 

 

 

 

https://customer.gabia.com/manual/dns/3041/3040

이미지 썸네일 삭제
가비아: 국내 1위

customer.gabia.com

 

 

제공받은 래퍼런스 인데 잘 이해가 안가시는 분은 이걸 보셔도 좋을 것 같습니다

 

 

 

3.TXT 레코드 잘 등록됐는지 확인

출처 입력

 

사이트에는 레코드 등록을 하면 10분 정도 기다려야 한다고 써있지만

보통 바로 되는 것이 일반적입니다 저는 주말이고 새벽이었는데도

레코드 등록이 되었습니다

대표사진 삭제

사진 설명을 입력하세요.

 

레코드 확인은 저기 보시면 빨간색으로 줄 친 부분의 Admin Toolbox 라고 서버에서 경로를 하나 주는데

저걸 복붙해서 이동하면 잘 등록됐는지 볼 수 있습니다

 

Record not found 라고 안뜨면 잘 등록된거에요!

 

잘 등록된걸 확인했으면 돌아와서 엔터키를 눌러주면 pem 파일이 발급되고

어디 저장되었는지 경로도 반환해줍니다

 

 

4.pem 파일을 keystore.p12 파일로 전환

출처 입력

스프링 부트에서는 pem 파일을 지원하지 않기 때문에, pkc12형태로 변경해줘야합니다.

아래의 openssl 명령어로 pkcs12 형태의 key를 복사해줍니다.

(pkcs12 파일을 만들때 password를 입력하는 과정이 있을 겁니다. spring boot 프로젝트에 적용하기 위해 필요하니 기록해주세요.)

 

 

sudo openssl pkcs12 -export -in /path/to/fullchain.pem -inkey /path/to/privkey.pem -out keystore.p12 -name tomcat -CAfile chain.pem -caname root
 

실제 코드 실행 시에는 /path/to 를 본인의 저장경로로 바꿔서 실행하세요

 

 

 

5.keystore 파일을 spring boot 에 업로드

출처 입력

대표사진 삭제

WinSCP 화면

코드가 성공적으로 실행됐다면 사진 처럼 서버에 keystore.p12 라는 파일이 저장된 것을 볼 수 있습니다

아마 저랑 똑같이 작업하신 분들은 /home/ubuntu 아래에 저장되어 있을 것 입니다

 

 

이제 이 파일을 다운 받아서 스프링부트 resource 폴더 아래에 붙여 넣어줍니다

 

 

그런데 아마 여기서 이 키파일에 접근할 수 없어 access denied 가 뜰 것 인데

 

 

sudo chmod 777 /home/ubuntu/keystore.p12
 

이 코드로 파일에 대한 접근 권한을 전부 허용해줄 수 있습니다

다만 이렇게 하는 건 위험한 방법일 수도 있으니 잘 고려해 보시고 하시길 바랍니다

 

 

 

6.application.yml 파일 수정

출처 입력

대표사진 삭제

사진 설명을 입력하세요.

 

resource 폴더 아래에 키파일을 넣어줬으면

위 설정처럼 spring boot application.yml 파일에 작성해주시고 아까 pem 파일 발급받을 때

설정한 비밀번호를 작성해주세요

 

alias 명이 저랑 다를 수있으니 alias 명을 확인하는 명령어를 찾아 실행해 보시고

입력하시기 바랍니다.

 

 

 

 

자 이제 서버에서 jar

java -jar [파일명].jar 
 

파일을 실행시키면 ip주소 없이 도메인 명으로 웹사이트 접속이 가능합니다!

https://{호스트명}/{도메인이름}/{포트번호}/경로로 접속해보세요

 

 

 

https가 아주 잘 적용이 되었네요

 

 

 

spring boot 환경에서 let's encrypt 로 인증서를 발급받는 과정이

정리가 잘되어 있는 글이 몇 없고 빠진 부분이 많길래

조금이나마 도움이 되고자 글을 써보았습니다

 

 

 

모두 개발 화이팅!