삶 가운데 남긴 기록 AACII.TISTORY.COM
https 테스트 용 SSL 사설 인증서 Tomcat 적용 본문
HTTPS 테스트용 SSL 사설 인증서 Tomcat 9 적용 방법
여기서 HTTPS 포트는 8443 을 사용할 것입니다.
CentOS7, JDK11, Tomcat9 기준으로 작성되었습니다.
HTTPS 통신 Handshake 과정
- 서버측: 서버 정보가 담긴 인증서와 공개키-개인키 쌍을 생성한 뒤 공개키를 인증기관(CA)에 등록합니다. (개인키는 서버측에서 관리하고 공개키는 인증기관에 등록되며 브라우저에 내장 됨)
- 클라이언트 측: 실제 데이터를 암호화할 때 필요한 대칭키 자체를 이 인증기관에 등록된 공개키로 암호화해서 이 암호문을 서버측에 전송합니다.
- 서버측: 클라이언트에서 전송된 암호문을 개인키(1에서 생성했던)를 써서 복호화하여 실제 클라이언트와 통신할 데이터를 암호화할 대칭키(암호키와 복호키가 같아서 대칭키)를 획득합니다.
- 클라이언트 측과 서버측은 이제 대칭키를 안전하게 나눠 가졌으므로 이제 데이터를 이 대칭키로 암호화-복호화하여 통신합니다.
SSL(Secure Socket Layer) 사설 인증서
HTTPS 통신을 위한 SSL 인증서는 보통 symantec, comodo 등 공인 인증기관에 비용을 지불하고 인증서를 받아서 웹서버나 WAS에 적용합니다.
그러나 HTTPS 테스트용으로 직접 인증서를 생성해서 사용하는 것을 사설 인증서라고 합니다.
Tomcat의 SSL 인증서
Tomcat에서 지원하는 keystore의 타입은 JKS, PKCS11, PKCS12 입니다.
JKS: JAVA 표준 키스토어 형식
PKCS12: 인터넷 표준 형식
JDK를 이용한 사설 인증서 생성과 keystore 파일 생성
JDK의 keytool 명령어를 이용해 인증서와 keystore파일을 생성할 수 있습니다.
keytool -genkeypair \
-alias tomcat \
-keyalg RSA \
-keysize 2048 \
-validity 365 \
-keystore keystore.p12 \
-storetype PKCS12
- -alias tomcat : 인증서 별칭
- -keyalg RSA : 키 생성 알고리즘을 RSA로 설정
- -keysize 2048 : 키 길이
- -validity 365: 유효기간 1년
- -keystore keystore.p12: 키스토어 파일명 지정
- -storetype PKCS12: 키스토어 유형 (JDK9이상)
tomcat 설정에 키스토어파일을 지정해주면 마찬가지로 HTTPS 통신을 사용할 수 있습니다.
Tomcat 설정
톰캣 디렉토리 내에 conf/server.xml 파일을 수정합니다.
https 관련 <Connector> 설정을 해줍니다.
tomcat의 server.xml에 기본적으로 주석 처리 되어있는 <Connector>설정은 두가지가 있습니다.
하나는 JSSE방식으로 org.apache.coyote.http11.Http11NioProtocol 프로토콜을 사용합니다.
다른 하나는 APR 방식으로 org.apache.coyote.http11.Http11AprProtocol 프로토콜을 사용합니다.
여기서는 간단한 JSSE방식으로 설정하겠습니다.
<Connector port="8443"
protocol="org.apache.coyote.http11.Http11NioProtocol"
SSLEnabled="true"
maxThreads="150"
scheme="https"
secure="true"
keystoreFile="키스토어 파일의 절대경로"
keystorePass="키스토어 생성시 입력한 패스워드"
keystoreType="PKCS12"
clientAuth="false"
sslProtocol="TLS" />
방화벽에서 8443 포트를 열어줍니다.
1. 8443 포트가 사용중인지 확인
sudo firewall-cmd --list-ports | grep 8443
2. 8443 tcp 포트 열기
sudo firewall-cmd --permanent --add-port=8443/tcp
3. 방화벽 갱신
sudo firewall-cmd --reload
그리고 tomcat을 재시작하면 https 통신이 가능합니다.
테스트
브라우저에서 https://localhost:8443 을 입력해서 테스트합니다.
브라우저에서 신뢰할 수 없는 인증서 경고가 뜨는데, 이는 사설 인증서이기 때문에 경고를 무시하고 테스트를 진행합니다.
HTTP 를 HTTPS 으로 리디렉션 설정
server.xml 에서 http 커넥터인 8080 포트 설정에 redirectPort 설정을 해줍니다.
<Connector port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
이 설정은 tomcat이 8080 요청을 https 포트인 8443 포트로 리디렉션 해줍니다.
모든 요청에 대해 HTTPS으로만 허용 설정(선택적 설정)
$CATALINA_HOME/webapps/앱컨텍스트루트/WEB-INF/web.xml 에 다음 항목을 추가해줍니다.
<security-constraint>
<web-resource-collection>
<web-resource-name>HTTPS Redirect</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
이 설정은 모든 요청(/*) 에 대해서 https 으로만 허용하게 합니다.
URL에 포트 번호 없이 접속하는 설정
Tomcat이 직접 443 포트를 사용하도록 설정
sever.xml 에서 https 커넥터의 포트를 8443이 아닌 443으로 설정
<Connector port="443"
protocol="org.apache.coyote.http11.Http11NioProtocol"
SSLEnabled="true"
maxThreads="150"
scheme="https"
secure="true"
keystoreFile="/절대경로/keystore.p12"
keystorePass="비밀번호"
keystoreType="PKCS12"
sslProtocol="TLS" />
그러나 1024 이하의 포트는 root 만이 열수 있기 때문에 root으로 tomcat을 실행하는 것보다 setcap으로 443포트를 열게 해줍니다.
sudo setcap 'cap_net_bind_service=+ep' $CATALINA_HOME/bin/java
참고로 운영 환경에서는 보통 웹서버(Nginx)로 443 포트를 리스닝하고 Tomcat으로 전달하는 방식을 사용합니다.
OpenSSL을 이용해 사설 인증서를 발급하는 방법(참고)
OpenSSL 다운로드 및 설치
사설 인증서를 발급하기 위해 openssl 이라는 프로그램이 필요합니다.
yum install -y openssl
open ssl을 실행시켜서 open ssl 프롬프트 상태에서 실행해도 되지만 여기서는 bash 프롬프트에서 실행합니다.
CA(Certificate Authority: 인증기관) 개인키 생성
RSA 알고리즘으로 2048 bit 길이의 CA 개인키를 생성
openssl genrsa -out rootCA.key 2048
CA CSR(Certificate Signing Request: 인증 서명 요청) 생성
CSR은 인증서를 발급하는데 필요한 인증 요청서입니다.
위에서 생성한 CA 개인키를 이용해서 CSR을 생성합니다.
openssl req -new -key rootCA.key -out rootCA.csr
실행하면 서버 정보를 입력해야 합니다.
사설 인증서이기 때문에 자유롭게 입력해도 됩니다.
예시)
Country Name : KR
State or Province Name : Seoul
Locality Name : SeoCho
Organization Name : Googol
Organizational Unit Name: YouDube
Common Name: 192.168.0.111
Email Address : mymail@gmail.co.kr
아래 쪽 패스워드는 입력하지 않아도 됩니다.
서버측 개인키 생성
위와 동일한 명령어로 서버측 개인키를 생성합니다.
openssl genrsa -out server.key 2048
서버측 CSR 생성
마찬가지로 CSR도 생성합니다.
openssl req -new -key server.key -out server.csr
서버 CRT(인증서) 생성
위에서 CA 인증서를 만들었으니 이 CA로부터 인증 받은 서버의 인증서를 생성해야 합니다.
openssl x509 -req -in server.csr -CA rootCA.crt -CAKey rootCA.key -CAcreateserial -out server.crt
위 일련의 작업들이 모두 성공했다면 다음과 같은 파일들이 생성됩니다.
rootCA.crt, rootCA.csr, rootCA.key, rootCA.srl, server.crt, server.csr, server.key
이 중에서 server.crt가 우리가 tomcat 서버에 적용해야 할 서버 인증서 입니다.
Tomcat에서 사용할 수 있는 keystore 파일 생성
openssl pkcs12 -export -in server.crt -inkey server.key -out keystore.p12 -name tomcat
여기서는 pkcs12 포멧으로 생성했습니다.
키스토어 비밀번호를 입력하라고 나오면 적당한 비밀번호를 설정해줍니다.
'DEV&OPS > Linux & Cloud' 카테고리의 다른 글
WSL 배포판 관리 (0) | 2025.03.11 |
---|---|
WSL(Windows Subsystem for Linux) 설치와 설정 (0) | 2025.03.05 |
git branch 관리: tracking, cherry-pick, stash (1) | 2025.02.20 |
Docker 기본 (0) | 2024.05.08 |
Docker 설치 (0) | 2024.05.08 |