SpringBoot 무료 SSL 인증서 적용하기 (Certbot)
1. 필요성
SSL 인증서 없이 웹 어플리케이션을 서버에 올리면 http로 접속이 되고
아래와 같은 경고가 나타난다.
"주의요함"
클릭해보면 보안이 취약하다는 문구가 뜨는게
내가 만들었지만 들어가기 싫어진다.
이때, 웹 어플리케이션에 SSL 인증서를 적용하면 보안연결(https - http Secure) 접속이 가능하다.
spring-boot에 무료 SSL 인증서 적용을 통해 보안연결을 적용해봤다.
2. Certbot을 통한 SSL 발급
1) Let's Encrypt - 알면 좋지만 몰라도 상관없음
SSL은 CA(Certificate Authority, 인증기관)에서 유료로 발급해주는 인증서로
보안연결(https)을 가능하게 한다.
https의 보급을 위해 mozilla, cisco, chrome, meta, aws 등 다양한 기관에서
후원을 해 2016년에 Let's Encrypt 라는 이름의 무료 인증기관이 생겼다.
그러나 이 무료 인증기관은 한 가지 단점이 있는데,
3개월마다 SSL을 갱신해야한다.
Certbot은 3개월마다 갱신해야하는 번거로움을 자동화해주는 오픈소스이며,
Let's Encryt에서도 이 방식을 추천한다.
2) Certbot 설치 / SSL 발급
* 서버 OS : Centos7 환경 기준, 다른 OS의 경우
https://certbot.eff.org/instructions 에서 상세 방법을 찾아볼 수 있다.
① snap 설치
--1) snap 설치를 위한 epel-release 설치
sudo yum install epel-release
--2) snap 설치
sudo yum install snapd
sudo systemctl enable --now snapd.socket
sudo ln -s /var/lib/snapd/snap /snap
② snap을 통한 certbot 설치
sudo snap install core
sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
③ certbot을 통한 SSL 발급
- 2가지 방법이 있다. (standalone : 서버 재시작 필요 / webroot : 서버 재시작 불필요)
- spring-boot의 경우 web app에 인증서를 포함시키는게 설정이 편해보여 standalne을 택했다.
sudo certbot certonly --standalone
- 이메일 입력, 도메인 입력 등을 하고 나면 아래와 같은 log가 나오며 SSL 인증서가 발급된다.
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/subbak2.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/subbak2.com/privkey.pem
- 스프링부트가 아닌 다른 웹 어플리케이션을 이용한다면
발급받은 pem 파일을 통해 https 설정이 가능하다.
3. SpringBoot에 SSL 적용
1) SSL인증서를 spring boot에서 필요한 형식(PKCS12)로 변환
- pem 파일이 위치한 경로에서 진행
openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem
-out keystore.p12 -name tomcat -CAfile chain.pem -caname root
- password를 입력하라고 나오는데 원하는 password로 설정하면 된다.
2) keystore.p12 파일을 /src/main/resources에 이동
application.properties 설정 (application.yml에서 설정해도 상관없음)
#SSL
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-type=PKCS12
server.ssl.key-store-password=내가정한password
3) spring-boot 빌드 후 upload
보안연결(https) 적용 완료