[Spring Boot] 내장 WAS 에 HTTPS(SSL)와 HTTP2를 적용하는 법

TenaLee·2021년 2월 19일
6

운영 혹은 개발 환경에서는 Nginx 혹은 AWS ELB와 같은 곳에서 SSL 인증서를 설치하게 되는데, 로컬 환경에서 개발해야 하는 경우 HTTPS 서버가 필요할때가 종종 있다. 순수하게 로컬 환경에서만 SSL 인증서를 사용할 수 있는 방법에 대해 기록해둔다.


Spring Boot 로컬 환경에서 SSL 인증서를 개발 & 적용 하는 방법

1. HTTPS (SSL)를 사용하려면 먼저 키저장소(keystore)를 만들어야 한다.

  • 프로젝트 디렉토리 안에서 다음의 명령어를 실행
keytool -genkey -alias [키저장소별칭] -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore [키저장할파일이름] -validity 3650

예) keytool -genkey -alias kanu-keystore -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore kanu-keystore.p12 -validity 3650

-genkey : 키를 생성하겠음
-alias : 키의 별칭
-storetype : 저장 타입
지원하는 스토어타입은 서블릿 컨테이너마다 다 다르다.
PKCS12, JKS, PEM 등 주요한 키 타입으로 3가지 정도 있는데,
톰캣을 사용하는 경우 PKCS12와 JKS만 지원이 되고, PEM은 지원하지 않는다.

  • JKS : Java Standard Keystore 포맷이며 JDK포함되어 있으며 keytool 명령어를 사용할 수 있다.
  • PKCS12 : 인터넷 표준 포맷이고 OPENSSL 를 사용하여 생성 할 수 있다.
    https://xinet.kr/?p=1674

2. 이후 묻는 정보들을 알맞게 입력한다.

마지막으로 "예"를 입력 후 엔터치면 끝
( 프롬프트가 한글으로 표시될 경우 "예"를 입력한다)
( 프롬프트가 영문으로 표시될 경우 "yes"를 입력한다 )

3. 프로젝트 디렉터리 안에 지정한 이름의 키저장소(keystore) 파일이 생성된 것을 확인할 수 있다.

4. 그럼 이제 위의 파일을 가지고, application.properties에 셋팅을 시작하면 된다.

참고 : server.ssl.key-store 값으로 파일의 위치 고려
위의 그림에서는 키스토어(kanu-keystore.p12) 파일이 프로젝트 루트에 위치해 있다.
하지만 만약 파일을 특정 위치로 이동시킨다면 다음처럼 경로를 포함해야 한다. 아래 그림은 클래스 패스 내(예: src/main/resources)로 파일을 이동했을 경우이다.

5. 앱을 구동하면 https가 적용된 것을 확인할 수 있다.
스프링부트는 내장 서블릿 컨테이너(Embedded Tomcat, Jetty, Netty or Undertow)가 사용하는 HTTP Connector를 기본적으로 하나만 등록한다. 그 커넥터에 SSL을 적용해준다.
적용이 됐다면 앞으로 모든 요청은 HTTPS 를 붙여서 해야한다.

6. 실제 접속을 해보자.

http://localhost:8080 으로 요청하면 다음과 같은 화면이 뜬다.

Bad Request
TLS (Transport Layer Security)가 없는 요청이므로 잘못된 요청으로 간주하고 요청을 안 받는다.

https://localhost:8080 으로 요청하면 아래와 같은 화면이 뜬다.

브라우저가 공개 키 인증서(Public key certificate)를 알 수 없기 때문이다.

브라우저가 서버에 요청을 보냈을 때, 서버에서 만든 인증서를 브라우저 측으로 보내게 된다 (앞서 만든 키스토어 안에 들어있는 인증서)

브라우저는 그 인증서의 펍키(Public Key)를 모르는 상태이기 때문에 이런 화면이 뜬다.

쉽게 말해 우리가 로컬에서 만든 인증서는 브라우저가 전혀 모르는 듣.보. 인증서이기 때문에 위와 같이 경고 화면을 보여주면서 "공식적으로 발급받은 인증서가 아닌 이런 듣.보. 인증서 인데도 그냥 들어갈 것인지" 물어보는 것이다.

공인된 인증서, GoDaddy 나 Let's Encrypt 등에서 발급하는 인증서들에 대한 펍키(Public Key)는 거의 대부분의 브라우저들이 알고 있다.
해당 인증서들은 위와 같이 경고 화면이 뜨지 않는다.
실제 앱 운영 시에는 공인된 인증서를 발급 받아 사용하면 된다.


참고: Spring Boot application secured by self-signed HTTPS

profile
Tenacity

0개의 댓글