스프링 부트 - SSL

SeungTaek·2021년 9월 21일
1
post-thumbnail

본 게시물은 스스로의 공부를 위한 글입니다.
틀린 내용이 있을 수 있습니다.

📒 1. 개념

📌 SSL과 TLS

  • SSL(Secure Sockets Layer), TLS (Transport Layer Security)
  • Netscape가 SSL을 개발. 폭 넓게 사용 중 표준화 기구인 IETF의 관리로 변경되면서 TLS라는 이름으로 바뀌었다.
  • 즉, SSL=TLS

📌 SSL 인증서 : 클라이언트와 서버간의 통신을 제 3자가 보증해주는 문서

  • 클라이언트가 접속한 서버가 신뢰할 수 있는 서버임을 보증
  • SSL 통신에 사용할 공개키를 클라이언트에게 전달

📌 CA(Certificate Authority) : SSL 인증서를 발급해주는 기업

  • 신뢰성이 엄격하게 공인된 기업들만 참여 가능
  • SSL은 CA를 통해서 구입해야 한다.
  • 각 브라우저 제작 기업들은 CA를 선정해 자사 브라우저에 리스트를 만든다.
  • 대표적인 CA 기업들
    • IdenTrust
    • DigiCert
    • Sectigo
  • 개발이나 사적인 목적을 위해 자신이 직접 CA 역할을 할 수도 있는데, 이런 경우 공인된 인증서가 아니기 때문에 브라우저는 경고를 출력한다.


📒 2. 스프링 부트에 SSL 적용시키기

keystore 생성 -> 인증서 생성 -> truststore 생성

  • 관리자권한으로 cmd 실행 후 다음 명령어 입력

📌 1. keystore 생성

keytool -genkey -alias [keystore 별칭] -keyalg RSA -keystore [keystore 파일이름] -storetype pkcs12
  • 위 명령어 입력 후 아래와 같은 부가적 정보를 차례로 입력한다.
    • 키 저장소 비밀번호
    • 새 비밀번호 다시 입력
    • 이름과 성 입력
    • 조직 단위 이름 입력
    • 조직 이름 입력
    • 구/군/시 이름 입력
    • 시/도 이름 입력
    • 두 자리 국가 코드 입력 -> ko
    • 정보 맞습니까? -> y

JKS(Java Keystore)란?

  • SSL 암호화를 위해 쓰이는 key들을 모아놓은 파일
  • JDK에서는 keystore를 조작할 수 있는 keytool을 제공함(생성 등이 가능)
  • keystore생성시 -storetype을 따로 지정해주지 않으면 JKS 형식으로 생성된다.

  • 다음과 같은 명령을 통해 생성한 keystore 정보 확인 가능
keytool -list -v -keystore [keystore 파일이름]



📌 2. keystore에서 인증서 export

keytool -export -alias [keystore 별칭] -keystore [keystore 파일이름] -rfc -file [인증서파일이름]
  • 다음과 같은 명령을 통해 인증서 확인 가능
type [인증서파일이름].cer

📌 3. trust store 생성

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

📌 4. 스프링 부트 설정

  1. cmd 명령을 실행한 디렉터리에 keystore파일과 truststore파일이 생성된걸 확인
  2. 프로젝트 디렉터리로 복사한다.
  3. application.yml 수정
server:
  ssl:
    enabled: true
    key-alias: [keystore 별칭]
    key-store: [keystore 파일 이름]
    key-store-password: [keystore 비밀번호]
    key-password: [인증서 비밀번호]
    trust-store: [truststore 파일 이름]
    trust-store-password: [truststore 비밀번호] 

📌 5. 접속해보기

  • 기존처럼 http로 접속하게 된다면 아래와 같은 화면이 출력된다.
Bad Request
This combination of host and port requires TLS.
  • 주소 앞에 https://를 붙여서 접속해보자
  • 그럼 보안 경고가 뜬다.
    • 우리가 직접 만든 인증서는 브라우저가 인정한 CA기관에서 발급받은게 아니기 때문에 그렇다.
    • 실제 서비스를 할땐 CA기관에서 인증서 구입 후 진행하면 된다.



✨ + http2 사용하기

  • tomcat 9.0.x , JDK9 이상을 사용, SSL 적용이 되어있다면 application.propertiesserver.http2.enabled=true를 추가하면 된다.


Reference

https://sarc.io/index.php/java/479-java-keystore-jks
https://opentutorials.org/course/228/4894
https://ayoteralab.tistory.com/entry/Spring-Boot-24-https-TLS-SSL-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0

profile
I Think So!

0개의 댓글