진짜 개발자
본문 바로가기

FrameWork/Spring Boot

Spring Boot - Self-Signed certificate(자체서명된 인증서)를 이용해 https 구축

728x90
이번 포스팅에서는 Spring boot 에서 self certificate를 이용하여 https를 구축하는 법을 알아보도록 하겠습니다

SSL 개념

https://galid1.tistory.com/602

이번 포스팅에서는 Spring boot 에서 self certificate(자가 인증서)를 이용하여 https를 구축하는 법을 알아보도록 하겠습니다. 만약 ssl에 대해서 개념이 부족하시다면 위의 링크를 참조해주세요.

 

 

 

 

1. Self Certificate를 사용하는 이유

보통 self certificate는 TEST를 위해 임시로 사용합니다.

 

 

 

 

2. 자체 서명 인증서(Self-Signed Certificate) 종류

우선 self certificate에 이용될 self-signed certificate(자체서명 인증서)의 종류에대해 얕게 알아보도록 하겠습니다.

 

JKS


JKS는 Java KeyStore의 준말로 PKCS12와 비슷하지만 JAVA환경에서만 사용이 가능합니다.

 

PKCS12


PKCS12는 Public Key Cryptographic Standards의 준말로 Password로 보호된 형식으로써, 여러 인증서 및 키를 포함할 수 있습니다. Java뿐만 아니라 여러 플랫폼에서 사용이 가능합니다.

 

 

 

 

 

3. Spring boot에서 Self-Signed Certificate를 이용해 Https 구축

이제 자체서명 인증서를 생성하고 https를 구축해보도록 하겠습니다.

 

3.1 self-signed certificate 생성

아래에서 알아볼 각각의 키스토어를 생성하는 명령어는 java의 keytool을 이용하는 것이므로, OS의 제약을 받지 않습니다. 따라서 Linux, Window 공통입니다.

 

PKCS12 생성




우선 cmd창을 열어 위의 명령어를 입력합니다. 그 후 원하는 password를 입력합니다. 나머지 정보는 굳이 입력하지 않고 enter만을 입력하여 넘어가도 됩니다. 마지막 정보를 확인하는 창에서 OS에 따라서 한글로 물어보는 경우 를 입력하고, 영어로 물어보는 경우 yes를 입력하면 keystore가 생성이 완료 됩니다.

 

저는 미리 프로젝트 경로로 이동한 상태에서 key 생성을 했기 때문에 위와 같이 바로 확인이 가능합니다.

 

 

JKS 파일 생성


같은 방식으로 위의 명령어를 이용하여 jks 파일 생성이 가능합니다.

 

생성된 파일입니다.

 

 

 

JKS 파일을 PKCS12로 변환


JAVA에서만 사용할 것이라고 생각하여 JKS로 생성했는데, 특별한 이유로 여러 플랫폼에서 사용할 필요성이 생겼다면, JKS파일을 PKCS12로 변환을 하는 방법이 필요할 것입니다.

 

-srckeystore옵션에는 jks파일을 주고, -destkeystore옵션에는 원하는 키파일이름+.p12 형식으로 입력하고 마지막으로 -deststoretype옵션에 pkcs12를 주면 됩니다.

 

대상 키 저장소 비밀번호 입력과 새비밀번호 다시입력은 변환 결과 목적 키파일인 .p12의 비밀번호를 입력하고, 소스 키 저장소 비밀번호 입력에는 변환 될 대상 키파일인 .jks파일의 원래 비밀번호를 입력하면 됩니다.

 

 

 

3.2 keystore 위치

keystore의 위치는 spring boot 프로젝트 기준으로 resources하위에 두면 됩니다.

 

properties 파일에 위와 같이 설정을 하면 됩니다. key-store에는 key-store파일의 위치를 입력해주면 되는데요, spring boot 기준으로 resources가 classpath에 등록이 되어있기 때문에 classpath:키파일위치로 입력 해주면 됩니다. key-alias에는 키파일 생성시 -alias옵션에서 주었던 정보를 입력하면 됩니다.

 

 

 

 

3.3 확인

https가 제대로 동작하는지 확인을 위해 위와같이 간단한 restcontroller를 생성합니다.

 

 

브라우저에서 확인



https://localhost:443/(443은 well-known port로 생략해도 됩니다.)로 요청을 하면 위와같이 화면이 나타나는데, 이 화면이 나타나면 우선 성공입니다. 위와 같이 나타나는 이유는 SSL개념 을 아신다면 무리없이 이해할 수 있는데요, 자체 서명된 인증서이기 때문에 CA기관에 등록되어 있지 않았음은 당연합니다. 따라서 당연히 브라우저의 CA리스트에도 있지 않기 때문에, 위험한 페이지임을 알려주는 것 입니다.

 

어차피 저희가 만든 페이지이므로 신뢰할 수 있습니다. 고급을 클릭한뒤, localhost(안전하지 않음)을 클릭합니다.

 

성공입니다.

 

 

 

Postman에서 확인


우선 postman에서는 Self-signed SSL Certificates페이지에 대한 요청을 자체적으로 막고 있습니다. 따라서 위와같이 요청시 Could not get any response라는 화면을 보게될 것입니다. 하지만 아래쪽에 충분히 설명이 되어있습니다. 특별한 경우가 아닌경우 빨간네모칸의 지시를 따르면 해결됩니다.

 


우측 상단의 렌치모양 아이콘을 클릭하고 Settings를 클릭합니다. SettingsGeneral탭에서 SSL certificate verificationoff설정으로 변환합니다.

 

 

 

3.4 The port may already be in use or the connector may be misconfigured.

자체서명된 인증서로 https 서버를 구축하시면서 위와 같은 에러를 거의 대부분의 경우 보게 되실거라고 생각합니다. 이 경우 거의 90% application.properties설정의 오류입니다. 에러메시지의 앞 부분인 port만을 보고 port가 이미 사용중인가 확인을 할수도 있지만, 저의 경우는 보통 설정의 오류 였습니다.

 

 

property key 오류


우선 application.properties의 property들의 key들을 정확히 입력하셨는지 확인합니다. 예를 들면, key-store-password 대신 key-password 키를 이용하셨을 수도 있습니다.

 

 

property value 오류


위의 경우가 아니라면, value를 잘못 입력하셨을 것입니다. keystore생성시 각 옵션에 대한 값을 제대로 확인한 뒤 생성을 하고 정확히 그값들을 입력해보세요.

 

 

port 사용중


정말 port가 사용중일 수도 있습니다. linux의 경우 netstat -nlp | grep {확인할port}명령어를 입력하여 사용중인 port의 pid를 확인한 뒤 kill -9 {pid}를 이용하여 프로세스를 종료시킨 뒤 다시 테스트 합니다.

window의 경우에는 netstat -nao | findstr {확인할port}를 이용하여 사용중인 port의 pid를 확인한 뒤, taskkill /f /pid {pid}를 이용해 프로세스를 종료시킨뒤 다시 테스트 합니다.