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 생성
xkeytool -genkeypair -alias baeldung -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore baeldung.p12 -validity 3650
우선 cmd
창을 열어 위의 명령어를 입력합니다. 그 후 원하는 password
를 입력합니다. 나머지 정보는 굳이 입력하지 않고 enter
만을 입력하여 넘어가도 됩니다. 마지막 정보를 확인하는 창에서 OS에 따라서 한글로 물어보는 경우 예
를 입력하고, 영어로 물어보는 경우 yes
를 입력하면 keystore가 생성이 완료 됩니다.
저는 미리 프로젝트 경로
로 이동한 상태에서 key 생성을 했기 때문에 위와 같이 바로 확인이 가능합니다.
JKS 파일 생성
xxxxxxxxxx
keytool -genkeypair -alias baeldung -keyalg RSA -keysize 2048 -keystore baeldung.jks -validity 3650
같은 방식으로 위의 명령어를 이용하여 jks 파일 생성이 가능합니다.
생성된 파일입니다.
JKS 파일을 PKCS12로 변환
JAVA에서만 사용할 것이라고 생각하여 JKS로 생성했는데, 특별한 이유로 여러 플랫폼에서 사용할 필요성이 생겼다면, JKS파일을 PKCS12로 변환을 하는 방법이 필요할 것입니다.
xkeytool -importkeystore -srckeystore baeldung.jks -destkeystore baeldung.p12 -deststoretype 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
를 클릭합니다. Settings
의 General
탭에서 SSL certificate verification
을 off
설정으로 변환합니다.
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}
를 이용해 프로세스를 종료시킨뒤 다시 테스트 합니다.
'FrameWork > Spring Boot' 카테고리의 다른 글
SpringBoot - Let's Encrypt로 무료 SSL인증서를 발급받아 SpringBoot에 적용하기(Https) (3) | 2019.08.08 |
---|---|
SpringBoot - SpringBoot H2 연결방법(H2 웹콘솔) (4) | 2019.08.05 |
SpringBoot - Controller에서 return 하는 Object의 field 이름변경 (@JsonProperty) (0) | 2019.06.22 |
SpringBoot - SpringBoot로 웹 개발하기 - 3(게시판 글작성 기능 추가) (2) | 2019.05.08 |
SpringBoot - SpringBoot로 웹 개발하기 - 2(API 만들기 , 테스트) (0) | 2019.05.02 |