https 사용을 위한 SSL 사설 인증서 발급 및 톰캣 적용 방법

https 프로토콜을 사용하기 위해 유료로 구매하는 SSL인증서가 아닌 openssl을 이용해 자체 서명 발급한 인증서를 이용해 WAS 톰캣에 적용해 https 프로토콜을 사용하는 웹 사이트를 구현해봤습니다.




https 프로토콜

https 프로토콜을 말하기 전에 우선 http 프로토콜에 먼저 알아야겠습니다.

우리가 웹브라우저를 통해 네이버나 구글에 접속해서 콘텐츠를 보는 이러한 행동들은 모두 하나의 웹문서(html)을 바탕으로 합니다.

이런 웹문서를 클라이언트에게 보여주고 상호작용을 하기 위한 통신 규약을 http프로토콜이라고 하는데요.

이런 http에 보안 기능을 더한것이 https 프로토콜입니다. https 프로토콜은 SSL인증서를 발급받아 웹서버에 설치해서 사용할 수 있습니다.


대게 공인 인증된 SSL인증서는 유료로 구매해야 합니다. 

저는 비용 발생없이 https 프로토콜을 사용할 일이 있어 자체 서명 인증서를 생성하고 그 인증서를 톰캣에 적용해보는 작업을 해봤습니다.




자체 서명 인증서 발급 과정

  1. openSSL 프로그램 설치
  2. 자체 서명 인증서 발급
  3. 톰캣 적용
openSSL-인증서-발급-프로세스
개인 사설 인증서 발급 프로세스


우선 자체 서명 인증서를 발급하기 위해 openSSL 프로그램을 다운로드하고 설치해 줍니다.


openSSL 자체 서명 인증서 발급

설치 후 cmd를 관리자 권한으로 실행 시켜 준 후 설치 경로의 bin 폴더로 이동합니다.
  • 기본 설치 경로 - C:\Program Files\OpenSSL-Win64\bin

1. 개인키 발급

  • openssl genrsa -out private_test.key 2048

private.key는 생성되는 개인키 파일 이름입니다. 이렇게 진행하면 비밀번호가 없는 개인키가 발급됩니다.

암호를 사용하려면 -des3 를 추가적으로 붙여 주면 됩니다.
  • openssl genrsa -des3 -out private.key 2048

저는 비밀번호 없이 개인키를 발급하고 진행해보도록 하겠습니다.


2. 공개키 발급

이제 발급된 개인키를 가지고, 페어를 이루는 공개키를 발급해야 됩니다.
  • openssl rsa -in private.key -out public.key


위 작업까지 진행하면, 개인키, 공개키 파일 각각 하나씩 생성되게 됩니다.



3. CSR 파일 발급

이제 CSR 파일을 발급해야 하는데, CSR 파일은 인증 기관에 인증서를 요청할 때 사용되는 파일입니다.
  • openssl req -new -key private.key -out private.csr

이 파일에는 위에서 작성한 공개키 정보와 함께 인증 받을 기관 및 단체의 정보를 적어줘야 합니다.

  • Country (C) - 국가코드 입력
  • State or Province (ST) - 지역 이름(ex 경기도 충청남도 등)
  • Locality (L) - 도시 이름
  • Organization (O) - 회사 이름
  • Organizational Unit (OU) - 부서명
  • Common Name (CN) - 도메인 명
  • Email Address - 관리자 이메일
  • Challenge Password (선택 사항) - 일부 CA(인증 기관)에서 추가 비밀번호를 요구할 경우에 사용하기 위함.
  • Optional Company Name (선택 사항) - 회사나 조직의 추가적인 명칭

위의 항목들은 영문으로 작성하면 되고, 주의할 사항 중 하나인 CN 항목인 도메인 명칭입니다.

여기에는 인증 받을 주소를 입력하면 되는데 www. blog. 과 같은 하위 도메인 명칭까지 써줘야 합니다.



4. CRT 만들기

위 CSR까지 생성이 완료되었다면 이제 확장자 crt 즉 인증서 파일을 생성해야 합니다. 

개인적으로 발급 받는 인증서가 아닌 공인 인증된 SSL인증서는 공인 인증 기관이 인증을 해서 발급을 받게 되는데, 이를 rootCA라고 합니다. 최상위 공인 인증 업체라고 생각하시면 될 것 같습니다.

1에서 3번까지 진행한 인증서를 인증해줄 인증 기관의 인증서를 발급해보도록 하겠습니다.
  • rootCA key 생성
    • openssl genrsa -aes256 -out rootCA.key 2048
    • 사용할 암호 입력
  • rootCA CSR 생성
    • openssl req -x509 -new -nodes -key rootCA.key -days 365 -out rootCA.pem
    • 3번의 CSR 발급에 필요한 정보를 입력(임의 값으로 진행해도 됨.)

이제 마지막으로 rootCA 인증서를 가지고, 사용할 인증서(CRT)를 발급해보도록 하겠습니다.
  • openssl x509 -req -in private_test.csr -CA rootCA_TEST.pem -CAkey rootCA_TEST.key -CAcreateserial -out private_test.crt -days 365

days의 경우 인증서 유효기간과 같은데 365 이상을 입력하면 브라우저에서 위조된 인증서로 인식할 수 있으므로 되도록 365일 이내로 적어줘야 합니다.

위와 같이 완료를 하면 private_test.crt 파일이 생성되게 됩니다. 이제 생성된 인증서를 톰캣에 연동해 주면 됩니다.




사설 SSL 인증서 톰캣 연동

위에서 발급된 확장자가 crt인 파일을 톰캣에 연동할 수 있는 인증 타입으로 변환이 필요합니다.
  • openssl pkcs12 -export -in private_test.crt -inkey private_test.key -out .keystore -name tomcat
위 명령어를 진행하게 되면 .keystore 파일이 생성되고 이제 이 파일을 톰캣에 등록해줘야 합니다.


톰캣이 위치한 폴더 하위의 conf 파일로 이동하여 server.xml을 엽니다.

사설-SSL-인증서-톰캣-연동-web_xml
톰캣 server.xml에 파일에 구문 추가


https가 사용하는 443포트에 해당되는 값을 입력합니다.


여기서 keystorefile의 경로는 위에서 생성한 .keystroe 경로를 keystorePass에는 인증서 비밀번호를 입력해줍니다.


일반적으로 http 프로토콜의 포트번호는 80이고, https의 포트 번호는 443입니다. 이렇게 인증서를 등록해 https를 사용할 수 있는 상태인데도, http로 접속이 들어오면 https로 리다이렉트 해줘야 하는데요.

Connector prot="80" 부분에 redirectPort="443"이 있는지 확인해주시기 바랍니다.



개인 발급 SSL 사설 인증서 톰캣 연동 결과

web.xml에 등록해줬다면, 톰캣을 shutdown 했다가 다시 가동해줍니다. 그리고 다시 웹 서비스를 접속해보면 아래와 같이 나오게 됩니다.

공인-SSL-인증서-연동-사이트-접속
공인 기관의 인증을 받은 SSL인증서를 설치한 사이트


인증서를 발급 받아 연동을 하였지만 보안 연결이 사용되지 않았다고 나옵니다. 
SSL-인증서-톰캣-연동-브라우저-확인
인증서는 정상적으로 설치되었지만 인증을 획득할 수는 없습니다. 그러나CORS 정책 위반 규칙에는 예외가 발생해 정상적으로 사용할 수 있습니다.


이는 개인 인증서를 발급 받았지만 공인된 기관에서 인증을 받지 않아 나오게 됩니다.


그러나, 실제로 필요했던 CORS 정책 위반으로 실행되지 않던 API가 정상적으로 진행되어 문제 없이 사용할 수 있었습니다.