...
HTTPS / SSL 란?
일단 HTTPS, SSL을 왜 사용할까?
우리는 링크를 통해 어떠한 사이트에 접속하게된다. 이 사이트가 아무 문제가 없는 사이트라면, 상관이없지만, 개인정보를 뻇는 사이트인지, 해킹 위험이 있는 사이트인지 우리는 알수가 없다. 따라서 이 웹사이트가 어떤 사이트인지, 누가 만든사이트인지, 통신이 안전한지 등의 정보알아야 하기때문에 HTTPS 통신을 한다고 보면 된다.
HTTPS/ SSL 통신을 하면, 인증기관( CA )에서 해당 사이트가 누구의 소유인가, 누가 만든것인가등의 정보를 인증해주고, 이러한 인증기관의 인증으로 안전한 사이트 접속을 하게 되기 때문이다.
- https ssl 이 적용된 사이트(공인된 CA의 인증서)
- https ssl 이 적용되지 않은 사이트
- https ssl 적용되었지만, 인증서가 보장되지 않은 사설인증(사설 CA)일경우..
나만의 SSL 인증서 발급 하기
HTTPS/SSL 암호화 통신을 하기위해서는 SSL 인증서가 필요하다. SSL 인증서를 발급해주는 전문적인 기관(CA)에서 발급 받을 수 있다. 이외에도 Verisign , comodo, thawte 등 여러 유료/무료 기관이 있다.
1. openssl 설치
먼저 ssl 인증서를 발급을 하기위해선 openssl이 필요하다. 해당 툴이 없다면 아래링크를 통해 설치하자.
https://sourceforge.net/projects/openssl/files/latest/download?source=typ_redirect%EF%BB%BF
설치가 완료되면, C드라이브 바로 아래 경로에 압축을 풀어주고 , 해당파일 /bin/openssl.exe 를 실행 한다.
만일 실행이 안되면 cmd 로 해당 경로 이동 후 , openssl.exe 혹은 관리자권한으로 실행해본다
2. 개인키 / 공개키 발급
실행이 됬다면, 먼저 PrivateKey를 생성해준다.
genrsa -des3 -out [키이름] 2048
genrsa -des3 -out private.pem 2048
명령어를 실행하면, 비밀번호를 입력해 줘야 한다. 비밀번호 입력과 비밀번호 확인 두번 입력하면 비밀번호가 담긴 개인키를 만들수 있다 .
공인인증서의 경우는 비밀번호가 필요하지만, https의 ssl 인증서에는 서비스등록할때마다, 비밀번호를 입력해줘야하기 때문에, 비밀번호가 없는 키를 새로 만들어주자.
genrsa -out [키이름] 2048
genrsa -out private.key 2048
비밀번호가 없는 private키를 새롭게 발급하였다.
이제 아래 명령어로 해당 개인키와 쌍이되는 공개키를 뽑아내보자
rsa -in [개인키] -pubout -out [공개키] rsa -in priavte.key -pubout -out public.key
개인키와, 공개키가 생성되었다.
3. CSR( 인증요청서 ) 만들기
CSR이란, SSL 인증의 정보를 암호화하여 인증기관에 보내 인증서를 발급받게하는 신청서이다. 정보항목에는 국가코드, 도시, 회사명, 부서명, 이메일, 도메인주소 등이 들어가있다. 다음 명령어로 CSR을 생성한다.
req -new -key [키] -out [CSR이름.csr]
req -new -key private.key -out private.csr
# 안되면
req -new -config ./openssl.cnf -key private.key -out private.csr
명령어 실행이 되면서, 추가 사항을 입력하면 된다. (개발용이기때문에 아무 정보나 입력)
4. CRT(인증서) 만들기
CSR까지 생성했다면, CRT는 그냥 만들수 있지만, 나만의 사설 CA에서 인증까지 받은 인증서를 만들어보려고한다.
먼저 인증서의 서명을 해줄 rootCA가 필요하다.
rootCA.key 생성하기
genrsa [암호화 알고리즘] -out [키이름] 2048
genrsa -aes256 -out rootCA.key 2048
rootCA 사설 CSR 생성하기
req -x509 -new -nodes -key rootCA.key -days 3650 -out rootCA.pem
# 안되면
req -config ./openssl.cnf -x509 -new -nodes -key rootCA.key -days 3650 -out rootCA.pem
(임시로 아무 국가,도시, 회사, 도메인,메일 등을 입력)
CRT 생성
x509 -req -in private.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out private.crt -days 3650
//안되면
x509 -req -config ./openssl.cnf -in private.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out private.crt -days 3650
파일을 확인해보면 CRT를 확인할수 있다.
Tomcat 서버에 HTTPS / SSL 을 적용
SSL 인증서 ( 인증서이름.crt )가 준비되었다면, TOMCAT에 인증서를 적용할것이기 때문에 pkcs12라는 형식으로 바꿔준다. 이 .keystore를 사용하여 SSL 통신을 구현할 수 있다.
pkcs12 -export -in private.crt -inkey private.key -out .keystore -name tomcat
1. .keystore 파일 경로를 원하는 위치에 이동
2. Tomcat 서버의 server.xml을 연다 (톰캣 위치 /conf 경로에 존재)
3. 아래의 소스코드를 추가한다
HTTPS통신을 할 포트번호를 정한다 (https는 Port 443이 기본이다. 혹시 기존에 해당 포트가 사용중이라면 , 다른포트를 이용하자)
keystorepass에는 키스토어 비밀번호를 입력한다. keystorefile에는 .keystore의 위치를 지정해준다.
// 생각 없이 복붙하지말고 비밀번호하고 경로 설정해준다 !!
< connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxthreads="150" sslenabled="true" scheme="https" secure="true"
clientauth="false" sslprotocol="TLS"
keystorepass="password" keystorefile="C:/OpenSSL/bin/.keystore" >
만일 이렇게 해도 안된다면, 같은 경로의 web.xml에 다으과 같이 추가해준다. http로 접속할때 강제로 https로 접속해주는 xml이다.
<security-constraint>
<web-resource-collection>
<web-resource-name>SSL Forward</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
4. 톰캣 서버에 접속해본다
자 매우 간단하게 HTTPS / SSL 통신을 위한 Tomcat 설정이 끝났다. 비록 인증서가 공인CA에서 인증된 인증서가 아니라 안전하지 않음 이지만 SSL 적용이 완료된 것이다.
# 참고자료
https://m.cafe.daum.net/hpss.co.kr/Kts5/18?q=D_N5A2_iIHQZo0&
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.