본문 바로가기
SpringBoot

[Spring Boot] 24. https TLS SSL 적용하기

by 청양호박이 2020. 1. 11.

지금까지 만들어온 Spring Boot 프로젝트는 browser에서 http://localhost:port를 입력해서 접속을 했습니다. 이는 향후 정상적인 DNS를 적용해도 동일합니다. 오늘은 SSL을 적용한 https로 접근하도록 Spring Boot에 적용하는 방법을 알아보겠습니다. 

 

물론 https가 뭔지 SSL이 뭔지를 제대로 알아보기 시작하면 방대한 내용을 알아봐야하겠지만, 그 정의만 위키백과에서 알아보면...

 

"전송 계층 보안 (영어: Transport Layer Security, TLS, 과거 명칭: 보안 소켓 레이어/Secure Sockets Layer, SSL) 컴퓨터 네트워크 통신 보안을 제공하기 위해 설계된 암호 규약이다. 그리고 '트랜스포트 레이어 보안'이라는 이름은 '보안 소켓 레이어'가 표준화 되면서 바뀐 이름이다. 이 규약은 인터넷 같이 TCP/IP 네트워크를 사용하는 통신에 적용되며, 통신 과정에서 전송계층 종단간 보안과 데이터 무결성을 확보해준다. " 

https://ko.wikipedia.org/wiki/%EC%A0%84%EC%86%A1_%EA%B3%84%EC%B8%B5_%EB%B3%B4%EC%95%88

 

전송 계층 보안 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 전송 계층 보안 (영어: Transport Layer Security, TLS, 과거 명칭: 보안 소켓 레이어/Secure Sockets Layer, SSL)[1]는 컴퓨터 네트워크에 통신 보안을 제공하기 위해 설계된 암호 규약이다. 그리고 '트랜스포트 레이어 보안'이라는 이름은 '보안 소켓 레이어'가 표준화 되면서 바뀐 이름이다. 이 규약은 인터넷 같이 TCP/IP 네트워크를 사용하는 통신에 적용되며, 통신 과정에서 전

ko.wikipedia.org

그렇다면 실질적으로 Spring Boot에 적용해 보도록 하겠습니다. 세부적인 단계는 아래와 같습니다.

 

  • keystore 제작
  • keystore에서 인증서 export
  • trust store 제작
  • application.yml에 설정 추가

 

1. keytool을 통한 인증서 및 store 제작


[keystore 제작]

지금부터 이루어지는 작업은 모두 JDK에서 제공하는 keytool을 이용해서 이루어 집니다. 따라서 내가 설치한 JDK가 있는 폴더로 이동합니다. 저는 "C:\Program Files\ojdkbuild\java-1.8.0-openjdk-1.8.0.232-1\bin" 이 경로입니다. 들어가보면 파일중에 keytool.exe가 있는지 확인합니다.

 

확인이 됬으면, CMD창을 엽니다. 단, 아무생각없이 그냥 열고 작업을 하게되면, 기껐 부가 정보를 다 입력하고 입력이 안되는 일이 발생합니다. 반드시 관리자권한으로 CMD를 열어야 합니다!!!

 

이제 keystore를 제작합니다.

keytool -genkey -alias [keystore 별칭] -keyalg RSA -keystore [keystore 파일이름]

#Sample
keytool -genkey -alias ayokeystore -keyalg RSA -keystore ayokeystore.jks

CMD에서 keytool이 있는 경로로 이동한 후, 해당 명령을 입력합니다.

그리고 부가정보를 쭉입력했더니... 으잉

"Warning:
JKS 키 저장소는 고유 형식을 사용합니다. "keytool -importkeystore -srckeystore ayokeystore.jks -destkeystore ayokeystore.jks -deststoretype pkcs12"를 사용하는 산업 표준 형식인 PKCS12로 이전하는 것이 좋습니다."

 

내가 뭘 했다고...!! pkcs12로 이전하라는 것이냐... 사실 keytool에서 keystore를 제작할때 기본적으로 JKS 형식으로 생성됩니다. 이는 -storetype을 별도로 지정하지 않으면 jks가 되기 때문입니다. 그렇다면 pkcs12로 지정을 해볼까요??

 

keytool -genkey -alias [keystore 별칭] -keyalg RSA -keystore [keystore 파일이름] -storetype pkcs12

#Sample
keytool -genkey -alias ayokeystore -keyalg RSA -keystore ayokeystore.pkcs12 -storetype pkcs12

정상적으로 생성이 되었습니다. 이를 명령을 통해서 확인해볼 수 있습니다.

keytool -list -v -keystore [keystore 파일이름]

#sample
keytool -list -v -keystore ayokeystore.pkcs12

 

[keystore에서 인증서 export]

이번에는 keystore에서 인증서를 추출해 보도록 하겠습니다.

keytool -export -alias [keystore 별칭] -keystore [keystore 파일이름] -rfc -file [인증서파일이름]

#sample
keytool -export -alias ayokeystore -keystore ayokeystore.pkcs12 -rfc -file ayotera.cer

이렇게 정상적으로 추출이 완료되었습니다. 확인하는 방법은...

type ayotera.cer

 

[trust store 제작]

이제 마지막 단계인 trust store를 제작합니다.

keytool -import -alias [trust store 별칭] -file [인증서파일이름] -keystore [trust store 파일이름]

#sample
keytool -import -alias ayotrust -file ayotera.cer -keystore ayotrust.pkcs12
(만약 cer가 인증기관 인증서라면... -trustcacerts 옵션을 추가)

이 단계가 끝났으면... 아까 살펴본 keytool.exe가 있던 폴더에 파일이 2개가 생겼을겁니다. 확장자는 pkcs12로입니다.

이렇게 정상적으로 생성했습니다.

 

 

 

2. application.yml 및 프로젝트 수정


지금까지 만든 프로젝트를 실행해서 localhost:8080으로 접근하면....

위와같이 https가 사용되지 않았다고 표시됩니다. 그렇다면 이제는 https가 사용됬다고 표시되도록 적용해 보겠습니다. 우선 application.yml에 추가 설정을하고, 아까 만들었던 store파일 2개를 프로젝트로 이동시켜주면 됩니다.

 

[application.yml]

server:
  port: 8888
  servlet:
    session:
      timeout: 30
  ssl:
    enabled: true
    key-alias: ayostore
    key-store: ayostore.pkcs12
    key-store-password: '@ayotera@'
    key-password: '@ayotera@'
    trust-store: ayotrust.pkcs12
    trust-store-password: '@ayotera@' 

이 부분을 추가합니다. 그리고 아까 생성한 파일 2개를 아래의 위치에 복사해줍니다.

그리고 시도를 해보면~!!

아무 생각없이 http로 시도하면 다음과 같이 Bad Request // This combination of host and port requires TLS. 라고 error가 발생합니다. 그렇다면 https로 연결하면 아래와 같이 인증서가 유효하지 않아 알림이 발생하지만 정상적으로 접근이 됩니다.

지금까지 https, tls, ssl의 적용에 대해서 알아보았습니다.

 

-Ayotera Lab-

댓글