𝝅번째 알파카의 개발 낙서장

screen

[SSL] Tomcat에 SSL 적용하기

posts

WEB

count

개요 🔗

SSL 인증서를 받았으니, 이를 적용해보자. 보통 Nginx 같은 웹서버나, Tomcat과 같은 WAS에 적용한다.

이 장에서는 Tomcat 9.0.50을 기준으로 설명한다.

Tomcat에 인증서 적용하기 🔗

Tomcat에 인증서를 적용한다. Tomcat Native가 설치되어있는지, 없는지에 따라 방법이 다르다.

Tomcat Native
Tomcat의 성능 향상을 위해 C, JAVA 같은 네이티브 모듈이 추가된다. Windows의 경우 dll 파일 하나만 옮기면 된다.

Tomcat Native가 적용되어 있다면 pem 파일을 바로 적용할 수 있으며, 아니라면 pemjks와 같은 호환 가능한 확장자로 적절히 변경해야한다.

Tomcat Native 설치방법 🔗

OS에 따라 Tomcat Native를 설치하는 방법이 다르다. Tomcat Native를 설치하지 않고도 SSL을 적용할 수 있으니, 관심이 없다면 이 단계를 패스해도 무방하다.

Windows 10 🔗

이 링크에서 Tomcat Native 라이브러리를 다운로드 받는다. 중간에 [Native 1.2.30 Windows Binaries.zip]을 다운로드 받으면 된다.

압축 풀면 [bin] 폴더에 tcnative-1.dll 파일이 있을텐데, 해당 DLL을 TOMCAT_HOME_HOME/bin에 옮기는 것으로 설치가 끝난다.

Linux(CentOS 7 이상) 🔗

BASH

0yum -y install tomcat-native

CentOS 7을 기준으로 위 명령어를 입력하면 된다. 만약 위와 같은 명령어를 사용할 수 없다면 직접 이 링크에서 컴파일해서 적용해야한다.

Linux(컴파일) 🔗

직접 소스를 컴파일해서 사용한다. CentOS를 기준으로 설명한다.

BASH

0yum install apr-devel openssl-devel

혹은 Devian 계열일 경우

BASH

0apt-get install libapr1.0-dev libssl-dev

컴파일 이전에 위 도구들이 설치되어있어야 한다.

이 링크에서 [Native 1.2.30 Source Release tar.gz]를 다운로드 받아 압축을 푼다.

BASH

0tar -zxvf Native 1.2.30 Source Release tar.gz

압축은 위 명령어로 해제하면 되며, OS에 따라 명령어가 다를 수 있다.

BASH

0cd ${압축 해제 경로}
1./configure --with-apr=/usr --prefix=${현재경로} --with-java-home=${JAVA_HOME}
2make
3make install

위 명령어를 순차적으로 입력해주면 된다.

SSL 인증서 적용하기 🔗

SSL 인증서를 적용하자. Tomcat Native 적용 여부에 따라 방법이 다르다.

Tomcat Native로 PEM 파일 적용하기 🔗

TOMCAT_HOME/conf/server.xml 파일을 열어보자.

XML

0<Connector protocol="org.apache.coyote.http11.Http11NioProtocol"
1 port="443"
2 scheme="https"
3 secure="true"
4 SSLEnabled="true"
5 SSLCertificateFile="example.com-crt.pem"
6 SSLCertificateKeyFile="example.com-key.pem"
7 sslProtocol="TLS" />

위와 같이 수정해주면 된다. SSLCertificateFilecrt.pem 파일을, SSLCertificateKeyFilekey.pem 파일 경로를 지정한다.

일반 Tomcat에 PEM to JKS로 변환하여 적용하기 🔗

어떠한 이유로든 Tomcat Native를 설치하지 못 할 경우, 일반 Tomcat은 PEM 파일을 인식할 수가 없다. 따라서 Tomcat이 지원하는 포맷으로 변환하여 사용해야한다. 이 문서에선 .jks 파일으로 변환하여 적용한다.

준비물은 아래와 같다.

  • OpenSSL
  • keytool (JAVA 깔면 있음)

OpenSSL은 직접 설치해야하고, keytoolJAVA_HOME/bin에 있으므로 JAVA가 있다면 따로 설치하지 않아도 된다.

BATCH

0# pem to p12
1openssl pkcs12 -export -out {name}.p12 -in {crt}.pem -inkey {key}.pem
2
3# p12 to jks
4keytool -importkeystore -srckeystore {name}.p12 -srcstoretype pkcs12 -destkeystore {name}.jks -deststoretype jks

위 명령어를 순서대로 입력하면 된다. 변환 과정에서 인증서에 저장할 비밀번호를 요구한다. 추후 웹서버에 해당 비밀번호를 제공해야하니, 잘 기억해두자.

4개였던 .pem파일과 달리 .jks는 심플하게 하나만 생성된다. 생성이 완료되면 TOMCAT_HOME/conf/server.xml 파일을 열어보자.

XML

0<Connector protocol="org.apache.coyote.http11.Http11NioProtocol"
1 port="443"
2 scheme="https"
3 secure="true"
4 SSLEnabled="true"
5 keystoreFile="example.com.jks"
6 keystorePass="비밀번호"
7 sslProtocol="TLS" />

keystoreFile에 생성한 .jks 파일을, keystorePass에 변환 과정에서 입력한 비밀번호를 입력한다.

확인 🔗

본 문서에선 SSL 포트를 443으로 설정했다. SSL의 기본 포트는 443이므로, 별도의 포트 표시를 하지 않아도 자동으로 연결될 것이다.

image

이제 톰캣을 기동하여, 도메인에 접속해보자. 인증서 정보가 확인되면 성공이다.

참고로, 인증서는 도메인을 기준으로 동작한다. 만약 localhost 내지는 127.0.0.1, IP를 입력하여 들어오면 인증서 오류가 뜨니 참고할 것.

정리 🔗

이로써 SSL 적용이 완료됐다. 처음엔 뭔가 복잡해보여도, 한 번 해두면 크게 어려운 부분은 없다.

Let's Encrypt는 DV 인증서를 무료로 받을 수 있는 가장 쉽고 빠른 방법이므로, SSL이 필요하다면 적극적으로 활용해보자.