Apache 2.4 톰캣 연동 및 SSL 적용 (Let’s Encrypt) @Windows

kimki·2022년 5월 13일
2

서버

목록 보기
1/1
  1. Tomcat - Apache 를 Reverse Proxy로 URL 연동하고,
  2. Let’s Encrypt로 무료 인증서를 발급 받아 SSL 적용하기.

사내 데모서버 구축간에 작성한 내용으로, 자세한 설정이나 DNS는 'company'등의 값으로 대체하였습니다.
Windows 탐색기는 Window앱 설치 버전, NoAgent는 웹브라우저 버전 서비스를 의미하며, 각각 Tomcat에 다른 Port로 서비스 되고 있다는 점만 알고 이해하시면 됩니다.

1. Tomcat - Apache 를 mod_proxy (Reverse Proxy) 연동

mod_jk와 mod_proxy 방식의 차이 → 결론: 아파치2.4부터는 성능 비슷, 간편한 mod_proxy.

❓ HTTPS를 사용하기 위해서 각각의 Tomcat에 인증서를 발급/적용 하지 않고, Proxy Server 역할의 Apache를 구성하여 Tomcat과 Apache서버를 연동 후 Apahce에만 SSL를 적용하려 합니다. 웹서버로써의 역할은 고려하지 않았습니다.

서비스 할 IP/DNS : 192.168.11.3 (demo.company.co.kr)
서비스 할 Port : 윈도우탐색기:80 , noAgent:82
서비스 톰캣 port : 윈도우탐색기:8080 , noAgent:8282

  1. Windows에서 Apache 서버를 구성할 때, 컴파일 작업 등을 하지 않기 위해서 아래의 링크에서 zip형태의 Apache를 다운로드 합니다. ( 각각 64 , 32 비트 OS용 )
    https://www.apachelounge.com/download/
  2. 적절한 위치에 압축을 풉니다. (여기서는 D:\httpd\Apache24)
  3. D:\httpd\Apache24\conf 에서 httpd.conf 를 편집합니다.

...
Define SRVROOT "D:/httpd/Apache24"
...
# 80과 82포트 등록
Listen 80
Listen 82
...
# 아래의 .so 라이브러리들은 사용을 위해 주석('#')제거해 준다.
LoadModule proxy_module modules/mod_proxy.so
...
LoadModule proxy_http_module modules/mod_proxy_http.so
...
ServerName demo.company.co.kr:80
...
# 아래 Include 주석 해제
Include conf/extra/httpd-vhosts.conf
  1. D:\httpd\Apache24\conf\extra\httpd-vhosts.conf 를 편집합니다.

    "3."에서 Include conf/extra/httpd-vhosts.conf를 이용해 사용됩니다.

<VirtualHost *:80>
	ServerName demo.company.co.kr
	ProxyRequests off
	ProxyPreserveHost On
	AllowEncodedSlashes NoDecode
	ProxyPass / http://demo.company.co.kr:8080/
	ProxyPassReverse / http://demo.company.co.kr:8080/
</VirtualHost>

<VirtualHost *:82>
  ServerName demo.company.co.kr
  ServerAlias www.demo.company.co.kr
  ProxyRequests off
  ProxyPreserveHost On
  ProxyPass / http://demo.company.co.kr:8282/
  ProxyPassReverse / http://demo.company.co.kr:8282/
</VirtualHost>
  • ProxyPass 와 ProxyPassReverse 에 설정된 주소 끝에 “ / “ 가 생략되어 502 Bad Gateway 혹은 Proxy Error가 날 수 있습니다. 확인 필수! :8080/ :8282/
  1. Tomcat은 "4." 의 ProxyPass에서 알 수 있듯이 :8080 과 :8282로 설정 되었습니다. Tomcat-conf/server.xml 에서도 Connector 관련 Port 확인이 필요합니다.
  2. Tomcat 과 Apache 서버를 기동합니다.
    cmd를 실행 후 Apache24\bin 경로에서 httpd.exe 를 입력후 엔터를 누릅니다. 에러 메세지가 나오면 조치를 취하고, 만약 한 칸 아래로 프롬프트가 이동한 상태라면 실행 중인 상태입니다.

ProxyPass 와 ProxyPassReverse 의 차이


2. Let’s Encrypt 인증서 발급, SSL 적용, 자동 갱신

win-acme 사용을 위해 .NET Framework 4.6.1 이상 업데이트가 필요함.

❓ Proxy Server인 Apache에 인증서를 적용하고, https:// 로 리다이렉트 되도록 설정하기.
무료인 Let’s Encrypt를 사용하고, 이를 발급/자동갱신 하기 위해 win-acme를 설치합니다.

  • 인증서 관련 준비를 먼저 수행하는 시나리오 입니다.

Let’s Encrypt 인증서 발급 및 자동 적용을 위한 win-acme 설치/사용법

https://jimnong.tistory.com/845 ← 조금 지난 버전이라 순서, 사용법이 약간 다름.

로컬에 인증서 경로를 생성할 때, httpd 어디에 할 지 미리 판단하여 설정해 주어야 자동 갱신을 알아서 할 때 문제가 없을것 같습니다. htdocs 경로에는 두지 말기

  1. D:\httpd\Apache24\conf\httpd.conf를 편집합니다.
...
Listen 80
Listen 82
# 443 추가
Listen 443
...
# 아래 모듈의 주석을 해제하여 Load한다.
LoadModule ssl_module modules/mod_ssl.so
...
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
...
LoadModule headers_module modules/mod_headers.so
...
  1. D:\httpd\Apache24\conf\extra\httpd-vhosts.conf 를 편집합니다.
# 80 (http)으로 접근시, https://demo...로 Redirect 함
<VirtualHost *:80>
	ServerName demo.company.co.kr
	Redirect 301 / https://demo.company.co.kr

	ProxyRequests Off
	ProxyPreserveHost On
	AllowEncodedSlashes NoDecode	
</VirtualHost>

# 80에서 Redirect 되었거나, https://demo...kr/ 인 경우.
<VirtualHost *:443>
  ServerName demo.company.co.kr:443
  ServerAlias demo.company.co.kr:443
  
  ProxyRequests Off
  ProxyPreserveHost On

  SSLEngine on
  SSLProxyEngine on
  SSLProxyVerify none
  SSLProxyCheckPeerCN off
  SSLProxyCheckPeerName off
  SSLProxyCheckPeerExpire off
  SSLCertificateFile "D:/httpd/demo.company.co.kr-chain.pem"
  SSLCertificateKeyFile "D:/httpd/demo.company.co.kr-key.pem"
  
  # Tomcat에게 명시적으로 
  RequestHeader set X-Forwarded-Proto "https"
  RequestHeader set X-Forwarded-Port "443"
  
  ProxyPass / http://demo.company.co.kr:8080/
  ProxyPassReverse / http://demo.company.co.kr:8080/
</VirtualHost>

# No Agent용 Tomcat
<VirtualHost *:82>
  ServerName https://demo.company.co.kr:82
  ServerAlias https://demo.company.co.kr:82

  ProxyRequests Off
  ProxyPreserveHost On

  SSLEngine on
  SSLProxyEngine on
  SSLProxyVerify none
  SSLProxyCheckPeerCN off
  SSLProxyCheckPeerName off
  SSLProxyCheckPeerExpire off
  SSLCertificateFile "D:/httpd/demo.company.co.kr-chain.pem"
  SSLCertificateKeyFile "D:/httpd/demo.company.co.kr-key.pem"
  
  RequestHeader set X-Forwarded-Proto "https"
  RequestHeader set X-Forwarded-Port "82"
  
  ProxyPass / http://demo.company.co.kr:8282/
  ProxyPassReverse / http://demo.company.co.kr:8282/
</VirtualHost>
  1. tomcat\conf\server.xml 를 편집합니다. ( noAgent, Agent 둘 다 적용함 )
...
<Service>
<Connector port="8080" protocol="HTTP/1.1" scheme="https"
               connectionTimeout="20000" URIEncoding="UTF-8"
               redirectPort="8443" />
...
  • scheme="https" 를 추가 (request, Mixed Content 에러가 생기지 않게 ) 웹서버(아파치 웹서버) – WAS(Tomcat) 구조에서, 웹서버에는 SSL 인증서가 입혀져 있고, WAS(Tomcat)에는 SSL 인증서가 입혀져 있지 않은 경우.
    • 웹서버를 통해 HTTPS 프로토콜로 접속하더라도 WAS에는 인증서가 입혀져 있지 않으므로, 백엔드 자바 단에서는 HTTP 프로토콜 및 80 포트로 접근했다고 인식되는 문제이다.
    • 톰캣의 server.xml 파일의 Connector 태그에 proxyPort=”443″ scheme=”https” 설정을 추가하면 된다.
    • jsp 로직 중 request.getScheme()로 URL을 조립하는 코드가 있는데, Tomcat은 http로 설정되어 있어서 http://.... 에 대한 URL을 반환합니다.

3. 실행 및 테스트

실행 순서

  1. 각각 Tomcat 실행 ( startup.bat )
  2. httpd.exe를 실행 ( CMD 관리자 권한으로 경로 이동 후 httpd.exe 엔터 )

테스트

No Agent

  1. PC에는 Agent 설치 안 된 상태,
  2. http://demo.company.co.kr:82 접속 → Bad Request
  3. https://demo.company.co.kr:82 접속 → ECM 접속
  4. 파일 업로드/다운로드

Windows 탐색기

  1. http://demo.company.co.kr 접속
  2. https://demo.company.co.kr 로 Redirect 되면서 접속 (브라우저 주소창 자물쇠 확인)
  3. → 설치 페이지 → 설치 , 재부팅 , 로그인 , 웹 브라우저 , 파일 업로드/다운로드 ,
    문서 수정 테스트.
profile
개발 자라는 사람.

0개의 댓글