TOMCAT에 SSL 구동 및 SSL 여러개 사이트 운용시 적용 방법
먼저 TOMCAT에 SSL을 사용하기 위해서는 JAVA / TOMCAT 이 설치되어 있어야 한다.
해당 부분은 다음 링크를 통해서 설치 진행하면 된다
https://xinet.kr/?p=1621 ( JAVA + TOMCAT + HTTPD + MYSQL 연동작업 )
무료 인증서은 let’sEncrypt는 인증서는 apache나 nginx에서 사용가능한 인증서인데 우리가 사용하려는 것은
tomcat에서의 인증서이다. 먼저 pem 인증서를 받은 후 openssl 를 이용하여 pkcs12 형태로 변경후 JKS 형태로 변환해서 사용
tomcat은 JKS, PKCS11,PKCS12 포맷의 keystore를 지원한다.
JKS 포맷은 jdk에 포함되어 있는 keytool 명령어로 사용하여 생성할 수 있다.
PKCS12 포맷은 인터넷 표준방식이며 openssl를 사용하여 생성 할 수 있다.
1. SSL을 사용하기 위해서 Certbot을 이용하여 무료 인증서를 발급 받자 ( pem 인증서)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[root@localhost ~]# yum -y install git [root@localhost ~]# git clone https://github.com/certbot/certbot.git [root@localhost certbot-master]# ./certbot-auto certonly --webroot --webroot-path=/free/home/xinet/html/ -d jsp.xinet.kr --email jsh@xinet.kr [root@localhost certbot-master]# ll /etc/letsencrypt/live/jsp.xinet.kr/ 합계 4 -rw-r--r--. 1 root root 692 2018-11-28 17:37 README lrwxrwxrwx. 1 root root 36 2018-11-28 17:37 cert.pem -> ../../archive/jsp.xinet.kr/cert1.pem lrwxrwxrwx. 1 root root 37 2018-11-28 17:37 chain.pem -> ../../archive/jsp.xinet.kr/chain1.pem lrwxrwxrwx. 1 root root 41 2018-11-28 17:37 fullchain.pem -> ../../archive/jsp.xinet.kr/fullchain1.pem lrwxrwxrwx. 1 root root 39 2018-11-28 17:37 privkey.pem -> ../../archive/jsp.xinet.kr/privkey1.pem |
2. 인증서가 저장되어 있는 디렉토리로 이동하여 openssl를 이용하여 pkcs12 방식으로 변환 후 jks 포맷
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[root@localhost certbot-master]# cd /etc/letsencrypt/live/jsp.xinet.kr/ [root@localhost]# mkdir /usr/local/tomcat/conf/ssl ### PEM 통합 [root@localhost jsp.xinet.kr]# cat privkey.pem cert.pem fullchain.pem chain.pem > jsp.xinet.kr.pem ### openssl 이용 변환 PEM -> PKCS12 [root@localhost jsp.xinet.kr]# openssl pkcs12 -export -out jsp.xinet.kr.pkcs12 -in jsp.xinet.kr.pem Enter Export Password:123456 Verifying - Enter Export Password:123456 ### KEYTOOL 를 이용하여 PKCS12 -> JKS 포맷으로 변환 [root@localhost jsp.xinet.kr]# keytool -importkeystore -srckeystore jsp.xinet.kr.pkcs12 -srcstoretype pkcs12 -destkeystore jsp.xinet.kr.jks -deststoretype jks 키 저장소 jsp.xinet.kr.pkcs12을(를) jsp.xinet.kr.jks(으)로 임포트하는 중... 대상 키 저장소 비밀번호 입력: 123456 새 비밀번호 다시 입력: 123456 소스 키 저장소 비밀번호 입력: 123456 1 별칭에 대한 항목이 성공적으로 임포트되었습니다. 임포트 명령 완료: 성공적으로 임포트된 항목은 1개, 실패하거나 취소된 항목은 0개입니다. |
3. 제없이 변환이 되었다면 keytool 명령어로 확인해보자.
1 2 3 4 5 6 7 8 9 |
[root@localhost jsp.xinet.kr]# keytool -list -keystore jsp.xinet.kr.jks 키 저장소 비밀번호 입력: 키 저장소 유형: jks 키 저장소 제공자: SUN 키 저장소에 1개의 항목이 포함되어 있습니다. 1, 2018. 12. 7, PrivateKeyEntry, 인증서 지문(SHA1): 91:AA:7D:6B:4A:20:26:0F:F5:83:1C:44:7E:06:D3:01:7D:EE:72:45 |
4. 이제 tomcat에 ssl을 적용하기 위해서 server.xml 파일을 열어서 아래와 같이 <connector> 있는 곳 아래에 내용을 추가
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[root@localhost ssl]# vi /usr/local/tomcat/conf/server.xml <!-- 권장 (tomcat native 미설치시 --> <!-- JKS SSL Password True / HTTP/1.1 / https-openssl-nio protocol --> <Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxHttpHeaderSize="8192" maxThreads="150" enableLookups="false" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" Protocol="TLS" keystoreFile="/etc/letsencrypt/live/jsp.xinet.kr/jsp.xinet.kr.jks" keystorePass="123456" /> |
5. tomcat 재시작 및 ssl 포트 확인 및 웹페이지에서 사이트 확인 HTTPS로 확인
1 2 3 4 5 6 |
[root@localhost ssl]# catalina.sh stop [root@localhost ssl]# catalina.sh start [root@localhost ssl]# netstat -anp | grep 443 tcp 0 0 :::443 :::* LISTEN 3124/java |
위와 같이 https://jsp.xinet.kr 로 접속시 ssl이 적용된것을 확인 할 수 있다
6. tomcat의 instance는 1개이며 tomcat에서 여러개의 ssl 사이트를 운용을 하게 될 경우 ssl포트를 변경해서 증가시키면 된다
웹서버인 apache의 경우 virtualhost를 이용하여 모두 443포트를 이용할 수 있지만 tomcat은 그렇게 되지가 않네 ( 이부분은 좀더 연구..ㅠㅠ)
구성은 간단하게 웹서버의 가상호스트 설정하고 tomcat 역시 가상호스트 설정
6-1. 먼저 apache 서버의 가상호스트 설정
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
[root@localhost ~]# vi /usr/local/apache/conf/extra/httpd-vhosts.conf <VirtualHost *:80> DocumentRoot /free/home/xinet/html/ ServerName jsp.xinet.kr CustomLog logs/jsp.xinet.kr_access_log vcommon JkMount /* ajp13 </VirtualHost> <VirtualHost *:80> DocumentRoot /free/home/xinet2/html/ ServerName jsp2.xinet.kr CustomLog logs/jsp2.xinet.kr_access_log vcommon JkMount /* ajp13 </VirtualHost> <VirtualHost *:80> DocumentRoot /free/home/xinet3/html/ ServerName jsp3.xinet.kr CustomLog logs/jsp3.xinet.kr_access_log vcommon JkMount /* ajp13 </VirtualHost> |
6-2 tomcat의 server.xml ssl 설정 및 가상호스트 설정
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
[root@localhost ~]# vi /usr/local/tomcat/conf/server.xml <!-- 권장 (tomcat native 미설치시 --> <!-- JKS SSL Password True / HTTP/1.1 / https-openssl-nio protocol --> <Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxHttpHeaderSize="8192" maxThreads="150" enableLookups="false" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" Protocol="TLS" keystoreFile="/etc/letsencrypt/live/jsp.xinet.kr/jsp.xinet.kr.jks" keystorePass="123456" /> <!-- 권장 (tomcat native 미설치시 --> <!-- JKS SSL Password True / HTTP/1.1 / https-openssl-nio protocol --> <Connector port="444" protocol="org.apache.coyote.http11.Http11NioProtocol" maxHttpHeaderSize="8192" maxThreads="150" enableLookups="false" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" Protocol="TLS" keystoreFile="/etc/letsencrypt/live/jsp2.xinet.kr/jsp2.xinet.kr.jks" keystorePass="123456" /> <!-- 권장 (tomcat native 미설치시 --> <!-- JKS SSL Password True / HTTP/1.1 / https-openssl-nio protocol --> <Connector port="445" protocol="org.apache.coyote.http11.Http11NioProtocol" maxHttpHeaderSize="8192" maxThreads="150" enableLookups="false" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" Protocol="TLS" keystoreFile="/etc/letsencrypt/live/jsp3.xinet.kr/jsp3.xinet.kr.jks" keystorePass="123456" /> <Host name="jsp.xinet.kr" appBase="/free/home/xinet/html" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="jsp.xinet.kr_access_log" suffix=".txt" pattern="%h %l %u %t %r %s %b" /> <Context path="" docBase="/free/home/xinet/html/" debug="0" reloadable="true"/> </Host> <Host name="jsp2.xinet.kr" appBase="/free/home/xinet2/html" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="jsp2.xinet.kr_access_log" suffix=".txt" pattern="%h %l %u %t %r %s %b" /> <Context path="" docBase="/free/home/xinet2/html/" debug="0" reloadable="true"/> </Host> <Host name="jsp3.xinet.kr" appBase="/free/home/xinet3/html" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="jsp3.xinet.kr_access_log" suffix=".txt" pattern="%h %l %u %t %r %s %b" /> <Context path="" docBase="/free/home/xinet3/html/" debug="0" reloadable="true"/> </Host> |
7. tomcat 서버 재시작 및 웹서버(apache) 재시작 및 포트 확인
1 2 3 4 5 6 7 8 9 10 11 12 |
[root@localhost ssl]# catalina.sh stop [root@localhost ssl]# apachectl stop [root@localhost ssl]# catalina.sh start [root@localhost ssl]# apachectl start [root@localhost ~]# netstat -anp | grep 44 tcp 0 0 :::445 :::* LISTEN 7176/java tcp 0 0 :::443 :::* LISTEN 7176/java tcp 0 0 :::444 :::* LISTEN 7176/java |
웹상에서 확인
tomcat 8.5 에서 SSL 사용시 JKS PKCS12 방식을 이용한 SSL 적용방법
여기 사이트에서 확실하게 확인 —-> https://xinet.kr/?p=1674