본문 바로가기
Java/Spring

SpringBoot에 Let's Encrypt 적용

by TheUphill 2020. 2. 23.

Spring Boot에 Let's Encrypt 적용하기

##Let's Encrypt?
https://letsencrypt.org/

사이트에 HTTPS를 적용하기 위해서는 Certificate Authority에서 발급한 인증서가 필요하다. 일반적으로는 CA에서 돈을 지불하고 인증서글 구입해야 하지만, HTTPS를 보급화 하기 위한 몇몇 조직들의 후원으로 무료 CA인 Let's Encrypt가 탄생했다.
아쉬운 점은 인증서의 기간이 최대 90일로 비교적 짧은 편이다. 하지만 Certbot을 이용해 자동 갱신이 가능하다.

설치하기

https://letsencrypt.org/getting-started/

인증서를 설치하기 위해서 크게 두 가지 방법이 있는데, 첫번째는 shell을 이용, 이용하지 않는 방법이다. aws를 이용해서 shell 사용이 가능하기 때문에 전자를 선택했다.

Certbot (https://certbot.eff.org/)

인증 서버로부터 인증 & 인증서 발급 & 설치를 간단하게 해준다. apache httpd, nginx 등은 좀더 간편하게 사용 가능. 또한 standalone 모드를 제공해 간이 웹서버를 이용한 인증방식 제공.

설치에 사용한 환경은 다음과 같다.

  • OS : centos7
  • 웹서버 : 아파치 톰캣 + Spring boot

certbot은 운영중인 웹서버 종류에 맞춰 최적화된 클라이언트들을 제공하지만 안타깝게 아파치 톰캣을 위한 클라이언트는 없어서 직접 설치하는 방법을 선택했다.

먼저 설치하고자 하는 서버해서 sudo yum install certbot으로 certbot을 설치한다.

cert-auto certonly --standalone -d my-doamin-name.net 명령어로 설치 시도. 파라미터에 대해 설명하면 --standalone은 certbox이 임시 웹서버를 띄워서 인증서버와 통신을 담당. -d my-domain-name.net은 내 웹서버의 도메인 주소를 입력한다. 하지만 어째서인지 임시 서버로 connection refused가 발생했는데 인증에 사용되는 80포트가 reserved 포트이며 해당 포트로 간이 웹서버가 뜨지 못하는걸로 보임(1024포트까지는 reserved 포트임)

그래서 standalone 모드를 포기하고 직접 인증서버로 부터 인증을 받기로 했다. cert-auto certonly --manual -d my-domain-name.net으로 구동하면 인증서버가 접속 시도할 URL과 그 URL에서 리턴해야 할 문구가 콘솔로 출력된다. 이를 충족하기 위해 서버에 코드를 조금 수정해서 다시 배포한 후 인증을 받았다.

스프링은 PEM 인증서를 지원하지 않기 때문에 부트가 지원하는 PKCS12 형태로 변화해야 한다. certbot으로 생성된 PEM 파일은 /etc/letsencrypt/live/my-domain-name에 위차한다. 해당 경로로 이동 후 openssl을 이용해 PEM 파일을 PKC12 형태로 변경한다.

$ openssl pkcs12 -export -in fullchain.pem \ 
                 -inkey privkey.pem \ 
                 -out keystore.p12 
                 -name tomcat \
                 -CAfile chain.pem \
                 -caname root

그리고 SSL을 지원하기 위해 스프링 부트 설정도 조금 변경해줘야 한다. 443포트 또한 reserved로 막혀있기 때문에 통신 포트를 8443으로 설정하고 서버에서 port forwarding을 이용해 443으로 들어오는 요청을 8443으로 매핑했다.

server.port: 8443
security.require-ssl=true
server.ssl.key-store:/etc/letsencrypt/live/my-domain-name/keystore.p12
server.ssl.key-store-password: <your-password>
server.ssl.keyStoreType: PKCS12
server.ssl.keyAlias: tomcat

정상적으로 인증서를 발급받고 서버를 구동시켜서 https로 사이트에 접속하면 인증서가 적용된 모습을 볼 수 있다.

댓글