0%

Spring Boot에서 HTTPS 적용하기

Spring Boot에서 HTTPS를 적용하려면?

Spring Boot환경에서 HTTP 통신으로 프로젝트를 구현하고 있었습니다.

하지만 보안적인 부분에 문제가 있어서 이 부분을 해결하기 위해 다양한 방법을 찾아봤습니다.

RSA로 암호화를 하는 방법을 주로 사용했었습니다.

하지만 이렇게 하는 것보다 그냥 HTTPS를 사용하여 처리하는 것이 좋을 것 같아서 이 부분에 대해 적용을 해보았고, 경험을 포스팅하려 합니다.

진행에 앞서 개발환경은 Mac OS X이고, Java가 설치되어 있는 환경에서 진행됩니다.


어떻게 진행을 해야 하는가?

먼저 다음의 스텝으로 진행을 합니다.

1. 키스토어 생성
2. 인증서 추출
3. Trust-Store 생성
4. Spring boot 환경 구성

위 순서대로 하나씩 진행을 해보겠습니다.


Key Store 생성하기

먼저 Key Store를 생성해줘야 합니다.

터미널을 열고 다음과 같이 명령어를 사용합니다.

keytool -genkey -alias (키스토어의 별칭) -keyalg RSA -keystore (생성할 키스토어의 파일명).jks

별칭은 KeyStore의 닉네임 같은 것이라 보면 되고, 이름은 KeyStore의 파일 명입니다.

실행을 하면 다음과 같이 KeyStore 정보를 입력하게 되고 생성이 완료됩니다.

KeyStore란?
KeyStore는 비밀키, 관련된 인증서 혹은 인증서 체인을 가지고 있는 데이타베이스입니다.
인증서 체인은 클라이언트 인증서와 하나 이상의 CA 인증서(공인인증서)로 구성됩니다.
보통 서버 역할을 하는 측에서만 필요하지만, 클라이언트 인증을 요구하는 경우 클라이언트 쪽도 있어야 합니다.


인증서 추출하기

Trust-Store를 생성하기 위해서는 1번에서 생성한 Key-Store에서 인증서를 추출해야 합니다.

아래의 명령어를 통해 인증서를 추출합니다.

keytool -export -alias (키스토어의 별칭) -keystore (키스토어의 파일명) -rfc -file (생성할 인증서 파일이름).cer


Trust-Store 생성하기

위에서 생성한 인증서를 통해서 Trust Store를 생성합니다.

keytool -import -alias (Trust-Store의 별칭) -file (인증서 파일명) -keystore (생성할 Trust-Store 파일명).ts

Trust Store란?
TrustStore는 클라이언트가 신뢰할 수 있는 인증서만을 가지고 있습니다.
이들 인증서는 CA 루트 인증서 즉 자기서명 인증서입니다.
보통 웹서버가 설치되면 cacerts.jks라는 파일명으로 이 TrustStore가 저장됩니다.


Spring boot 환경 구성하기

위에서 생성한 KeyStore, Trust-Store를 통해서 이제 Spring boot에서 SSL 구성을 해보도록 하겠습니다.

먼저 Spring boot에서 환경설정을 엽니다.

application.properties를 많이 사용하지만 저는 application.yml을 사용하기에 여기에 맞춰서 설명하겠습니다. (사실 둘다 비슷해서..)

1
2
3
4
5
6
7
8
9
10
server:
port: 8090 #Https port
ssl:
enabled: true
key-store: /home/test/mhlab_keystore.jks # 1번에서 생성한 Key store 경로와 파일명을 적어줍니다.
key-store-password: passwd # 1번에서 생성한 Key store의 비밀번호를 적어줍니다.
key-password: passwd # 1번에서 생성한 키스토어의 마지막의 키 비밀번호
key-alias: mhlab # 키 스토어 별칭
trust-store: /home/test/mhlab_keystore.ts # 2번에서 생성한 Trust-Store 경로
trust-store-password: passwd # Trust-Store 비밀번호

위와같이 구성 후 서버를 구동하고 브라우저에서 접속을 해봅니다. (크롬 브라우저 기준)

위와 같이 뜨는 이유는 생성한 인증서가 공식적으로 인증받지 않은 인증서이기 때문입니다.

이 부분은 향후 다시 포스팅 하기로 하고… 하단의 고급 버튼을 클릭하면…

이렇게 세부정보가 나오고 하단의 localhost(안전하지 않음) 을 클릭하면 페이지가 이동됩니다.

그리고 접속한 주소를 확인해보면 위와 같이 https로 표시됩니다.


결론

사실 지금까지 해본 플로우로 적용하는 것 자체는 쉬운 편입니다.(?)

하지만 저기에서 쓰인 SSL이나 인증서, Keystore, Trust-Store 및 Java의 Keytool 등에 대한 것에 대한 이해는 쉬운 편은 아니라 생각합니다.

다음 포스팅에서는 위와 같은 이론적인 측면을 포스팅해보도록 하겠습니다.