진짜 개발자
본문 바로가기

FrameWork/Spring Boot

SpringBoot - Let's Encrypt로 무료 SSL인증서를 발급받아 SpringBoot에 적용하기(Https)

728x90
lets encrypt

이번 포스팅에서는 Springboot에 HTTPS를 구축하는 방법을 알아보도록 하겠습니다. 그동안은 서비스를 출시 하더라도 HTTP로 출시하는 경우가 많았는데요, 이번 백엔드 구축시에는 클라이언트에서 보안상의 이유로 HTTP에 Fetch 요청을 보내지 못하는 상황이 발생하여, HTTPS를 구축해야하는 차에 무료 SSL 인증서 발급 방법을 찾아내어, 무료로 SSL 인증서 발급받는 방법에 대해 포스팅을 하려고 합니다.

 

 

 

 

SSL, HTTPS, CA 개념

https://galid1.tistory.com/602

이번 포스팅은 SSL, HTTPS, CA에 대한 개념을 가지고 계시다는 전제하에 진행을 하도록 하겠습니다. 잘 모르시다면 위 링크를 참고해주세요.

 

 

 

 

Let's Encrypt 등장배경

기존의 https 도입을 위해서는 ssl 인증서를 구매하고, 인증 기관(CA)에 등록하며 이를 일정 주기마다 갱신해야 했기 때문에, 만만치 않은 비용이 들었습니다. 때문에 이점이 HTTPS의 보편화에 방해가 된다고 판단이 되어 만들어 졌습니다.

 

이에 따라 웹사이트의 https도입을 부추기고자 모질라, 시스코, 구글등의 다양한 업체가 let's encrypt의 스폰서로 참여하며 더더욱 많은 사이트에서 https를 도입하는 추세입니다.

 

또한, 2017년 즈음부터 구글에서 발표한 내용에 따르면, 국내 대다수의 기업이 https를 사용하지 않는것에 의아함을 표출했으며, 곧이어 https가 적용되지 않은 사이트에는 붉은 경고 표시를 띄울 것 이라고 표명했습니다.

 

 

 

 

 

Spring boot에 Let's encrypt를 통해 발급받은 SSL인증서로 HTTPS 구축하기. (feat. AWS)

구축 방법에 대한 설명은 다음의 절차로 진행하도록 하겠습니다.

 

목차

  • 준비물 소개

  • AWS EC2 서버 생성 및 공인 IP 발급 (EC2)

  • 도메인 구매 및 DNS 등록 (Route 53)

  • let's encrypt를 통한 SSL 인증서 발급

  • Spring Boot에서 설정

  • EC2에 배포

  • HTTPS 확인

  • DNS CAA 레코드 등록

     

몇몇 내용들은 이전에 포스팅한 링크로 대체하도록 하겠습니다.

 

 

1. 준비물

  • 공인 IP가 부여된 서버
  • 도메인

특별히 필요한 준비물은 위와 같습니다. 도메인을 부여하기 위해서는 공인 IP가 부여된 서버가 필요하며, SSL인증서를 발급하기 위해서는 도메인이 부여된 서버가 필요합니다.

 

 

 

 

2. AWS EC2 서버 생성 및 공인 IP 발급 (EC2)

EC2 서버 생성

https://galid1.tistory.com/224

EC2를 생성하기 위해서 위의 링크를 참고해주세요.

 

 

공인 IP 발급

위의 절차를 따라하셨다면 이미 공인IP를 발급 받으셨습니다. 공인 IP 발급은 간단합니다. EC2 생성중 Auto-assign Public IPEnable로 설정해주시면 됩니다.

 

 

 

 

3. 도메인 구매 및 DNS 등록 (Route 53)

3.1 도메인 구매

https://galid1.tistory.com/358

AWS Route53을 통해 도메인을 구매하기 위해서는 위의 링크를 참고해주세요.

 

 

3.2 DNS 등록

DNS는 다들 아시다시피 도메인에 연결된 서버 IP를 찾아주는 역할을 하는 시스템을 의미합니다. 즉 도메인을 이용해 우리의 서버로 요청을 할 수 있도록 도와주는 역할을 합니다.

 

우선 DNS 등록을 위해서는 서버의 공인 IP를 알아야 합니다. (앞서 설명한 EC2의 이름과 다릅니다 양해 바랍니다.)

 

Route 53 서비스의 호스팅 영역 탭에서 앞서 구매한 도메인을 클릭합니다.(앞서 구매한 도메인 이름과 다릅니다 양해 바랍니다.)

 

레코드 세트 생성을 클릭한 뒤, 적절한 DNS 레코드 이름을 부여하고, 란에 앞서 복사한 공인 IP를 붙혀넣습니다.

 

 

DNS 확인

Windows의 경우 CMD Linux의 경우 terminal에서 nslookup domain을 입력합니다. 그 후 응답으로 IP가 나타난다면 성공적으로 등록이 된 것입니다.

 

 

 

 

4. Let's Encrypt를 이용해 SSL 인증서 발급

저의 경우 실습환경이 Window인데요, 보통 실무 또는 배포 환경이 Linux이기 때문에 linux를 통해 certbot으로 인증서를 발급받고 그것을 window로 옮겨 spring boot에 설정한 뒤 다시 배포하는 방식으로 진행을 했습니다.

 

4.1 certbot을 이용해 인증서발급

let's encrypt의 홈페이지로 이동하면 위와 같이 Certbot을 이용해 인증서를 발급 받을 것을 추천하고 있습니다. 저 또한 사용해본 결과 CertBot을 통해 인증서를 발급받는 것을 추천드립니다.

 

https://certbot.eff.org/

우선 위의 링크로 이동합니다.

 

그 후 사이트 중간쯤에 보시면 My HTTP website is running ~가 보입니다. 저희는 Spring Boot를 사용할 것인데요. 아쉽게도 soft wear 목록에 없기 때문에, None of the above를 선택합니다. 그 후 맞는 운영체제를 선택하시면 됩니다. (Amazon Linux 2는 CentOS 기반입니다.)

 


이제 페이지에 보이는 절차를 따라하면 됩니다. 첫째로 HTTP 웹사이트가 구동중인 서버로 접속해야합니다. SSH 클라이언트를 이용해 접속합니다.

 

 

https://aws.amazon.com/ko/premiumsupport/knowledge-center/ec2-enable-epel/

그 후, CentOS의 경우 EPEL을 활성화 해야 하는데요. Amazons Linux의 경우에는 위의 링크를 따라가시면 수월하게 해낼 수 있습니다.

 

위의 링크로 이동하면 CentOS 배포버젼별 명령어가 보이는데요, Amazon Linux2의 경우에는 위의 명령어를 입력하면 됩니다.

 

이유는 더 찾아봐야 합니다만, 위의 설명대로면 optional channel을 활성화 해야한다고 합니다. 명령어를 따라 입력합니다. (위의 명령어를 입력하기 위해서는 관리자(root) 여야 하므로, sudo su -를 통해 관리자인 상태에서 입력을 하거나, 명령어 앞에 sudo를 붙혀줍니다.)

 

드디어 certbot을 설치합니다.

 

 자동으로 인증서를 발급받는 부분입니다. Server가 정지되지 않길 원한다면 sudo certbot certonly --webroot를 상관 없다면, sudo certbot certonly --standalone를 입력합니다. 저희는 아직 서버를 구동하지 않았으므로 sudo certbot certonly --standalone를 입력합니다.

 

위 그림처럼 명령어를 입력하면, 이메일을 입력하라고 나타납니다 이메일을 입력해줍니다.

 

곧이어 동의 절차글이 나타납니다. A, Y를 차례대로 입력합니다. 마지막으로 SSL인증서를 발급받고자 하는 도메인을 입력합니다.

 

성공한다면 위와 같은 화면이 나타납니다. 위에서 알려주는 경로로 이동합니다.

 

 

 

4.2 pem을 PKCS12 형식으로 변경


발급받은 키들이 모여있는 위치로 이동하여 위의 명령어를 입력하면 keystore.p12파일을 얻을 수 있습니다.

 

key file을 ec2-user의 홈디렉토리로 이동시킵니다.

 

 

 

 

5. Spring boot에서 인증서를 적용

 

5.1 keystore를 로컬로 옮기기

앞서서 말씀드렸듯이 저는 Window에서 개발을 진행하고 있어서, 리모트서버에서 keystore 파일을 로컬로 옮겨야 합니다. 저는 Filezilla라는 FTP 프로그램을 이용할 것입니다.

 

https://luckyyowu.tistory.com/321

우선 연결할 대상인 원격서버를 등록하기 위해 그림에 보이는 아이콘을 클릭합니다. 그 후 New Site를 클릭하여 사이트를 생성하고 위그림과 설정을 합니다. 만약 ec2에 대한 접속을 비밀번호로 접속할 수 있도록 설정하지 않으셨다면 위 링크를 따라가 설정해주세요. (위 링크에서는 ssh를 비밀번호로 접속할 수 있도록 하는 설정방법만을 설명합니다. 사용자에 대한 비밀번호를 설정하기 위해서는 sudo passwd 사용자명 명령어를 이용해주세요.)

 

접속시 ec2-user로 접속되기 때문에 아까 옮겨놓은 키파일이 보입니다. 간단히 드래그 드롭으로 옮깁니다.

 

위와 같이 permission denied가 나타난다면,

 

위의 명령어를 통해서 다른 사용자(other) 에게 읽기 권한을 주어야 합니다.

 

 

 

 

5.2 Spring Boot 설정

Spring Boot를 실행합니다. 그후 resources하위에 keystore.p12를 드래그 드롭합니다. 그다음 application.yml(properties) 파일을 열어 그림과 같이 설정합니다.

 

그 후 위와 같이 간단히 Controller를 생성합니다.

 

서버를 실행한 뒤, 위와 같이 도메인을 입력하여 접속합니다. (https://localhost:443) 443은 생략가능합니다.

 

 

 

6 EC2로 배포

6.1 deployment tool 설정

이제 설정을 완료했으니, SpringBoot Application을 EC2로 다시 배포해야합니다. Intellij를 사용중이라면 Deployment tool을 이용해 간단히 배포가 가능합니다. 위의 그림대로 따라서 설정창을 엽니다.

 

+를 눌러 새로운 SFTP사용자를 생성합니다. 그림을 따라 설정을 진행한 뒤 Test SFTP Connection을 클릭하여 연결을 확인합니다.

 

Mappings탭으로 이동합니다. Local path에는 배포할 application이 존재하는 경로를 입력합니다. gradle의 bootJar 테스크를 사용한다면 프로젝트경로\build\libs하위에 .jar파일이 생성됩니다.

Deployment path on server ''에는 배포할 서버의 경로를 입력합니다. 사용자의 홈디렉토리로 지정하겠습니다.

 

 

6.2 Gradle을 이용한 배포하기 위한 jar파일 생성

gradle task를 이용해 jar파일을 생성하려면 우측의 Gradle탭을 클릭한뒤, build / bootJar를 더블클릭하여 실행합니다.

 

아까 말씀드렸던 프로젝트경로\build\libs를 보면 .jar 파일이 생성된것을 확인할 수 있습니다.

 

 

 

6.3 deployment tool을 이용해 배포

여기서 조금 많이 헤메실 수 있는데요, 우선 방금 생성된 .jar파일을 선택해야합니다. 그 후 deployment의 upload to 서버를 클릭하면 자동으로 배포가 이루어집니다.

 

remote 서버를 확인하면 성공적으로 배포가 이루어진것을 확인할 수 있습니다.

 

 

6.4 jdk 설치 및 Spring Boot Application 실행

java application을 실행하기 위해서는 당연히 jdk가 설치되어있어야 합니다. 위 명령어를 통해 설치합니다.

 

위의 명령어를 이용해 어플리케이션을 실행합니다.

 

 성공입니다.

 

 


7. SSL 확인

https://www.ssllabs.com/ssltest/

HTTPS 가 성공적으로 인증이 되고있는지 확인을 위해서는 위의 사이트로 이동해 검증을 해보아야 합니다.

 

도메인을 입력한 뒤 submit을 클릭합니다.

 

검증결과 입니다. 성공하셨다면 위와 같은 그림을 보실 수 있습니다. 하지만 DNS CAA설정을 진행해주셔야 하는데요. 아래에서 자세히 알아보도록 하겠습니다.

 

 

 


8. DNS에 CAA레코드 등록

CAA ?

CAA는 등록된 HTTP사이트의 SSL 인증서를 보관하고 있는 CA기관에 대한 DNS 레코드 유형중 하나입니다. 간단히 말씀드리자면, 인증서를 보관하고 있는 CA를 알려주는 DNS 레코드입니다.

 

https://letsencrypt.org/docs/caa/

위의 링크로 이동하면 CAA에 대한 자세한 정보를 얻을 수 있습니다.

 

Route53으로 이동해 CAA레코드를 추가합니다. 란에는 다음과 같은 0 issue "인증기관"형식으로 기입을 합니다. let's encrypt 인증기관의 도메인은 letsencrypt.org입니다.

 

긴글 읽어주셔서 감사합니다.