[Embedded Tomcat] Spring Boot 앱에 SSL 인증서 설정하기

2020. 9. 10. 12:36CentOS 7/WAS

300x250
반응형
  1. 개요
  2. private key 생성 및 서버인증서 발급
  3. Keystore 생성 및 적용
    3-1) keystore?
    3-2) PKCS12 포맷으로 변환하기
    3-3) 프로퍼티에 SSL/TLS 인증서 설정하기
    3-4) 방화벽 개방

1. 개요

단독 실행 가능한 Jar로 Spring Boot 애플리케이션을 패키징 할 경우, Spring Boot 애플리케이션은 내장 톰캣(Embedded Tomcat)을 이용하여 앱을 실행시킵니다.

내장 톰캣에 대한 설정은 application.yml 구성파일에서 설정할 수 있습니다.

아래 코드는 application.yml의 서버관련 부분입니다.

server:
  address: 호스트주소
  servlet:
    context-path: /
  port: 서비스할 포트
  ssl:
    enabled: true
    enabled-protocols:
    - 활성화할 프로토콜
    key-store: 키스토어 경로
    key-store-password: 키스토어 비밀번호
    key-store-type: "PKCS12" | "JKS"
  tomcat:
    basedir: .
    remote-ip-header: X-Forwarded-For
    protocol-header: X-Forwarded-Proto
  use-forward-headers: true

Apache 웹서버나, Tomcat 처럼 내장 톰캣에서도 SSL/TLS에 관한 설정을 추가할 수 있습니다.

설정에 관한 자세한 정보는 아래에서 확인해봅시다.


2. private key 생성 및 서버인증서 발급

openssl을 이용하여 private key와 csr을 생성하는 방법과 CA(Certificate Authority, 인증기관)를 통해 서버인증서를 발급받는 방법에 대해서는 [CentOS 7] Apache 2.4의 VirtualHost에 SSL 인증서 설정하기 포스팅을 참고해주세요.

private key를 생성하는 부분과 서버인증서를 발급받는 부분은 생략합니다.

3. Keystore 생성 및 적용

3-1) keystore?

Tomcat은 JKS, PKCS11, PKCS12 포맷의 keystore를 이용한 SSL/TLS 설정을 지원합니다.

이 keystore들은 private key와 X.509 기반의 인증서들(서버인증서 및 루트CA인증서, 체인인증서들)을 통합한 파일입니다.

SSL/TLS 인증에 필요한 모든 파일들을 하나의 파일로 통합한 것이기 때문에 인증서 설정이 매우 간편하다는 장점이 있습니다.

3-2) PKCS12 포맷으로 변환하기

PKCS#12(Public-Key Cryptography Standards)

키스토어 포맷은 여러종류가 있지만, 그중 산업 표준 형식인 PKCS12포맷으로 변환합니다.
PKCS12 포맷으로 변환한 키스토어 파일의 확장자는 .pfx, .p12입니다.

openssl pkcs12 -export \
-name demo.jiniworld.me \
-in /etc/pki/tls/certs/demo/server.crt \
-CAfile /etc/pki/tls/certs/demo/caChain.crt \
-inkey /etc/pki/tls/private/demo.key \
-out /etc/pki/tls/certs/demo/demo.p12
  • -in : 서버인증서
  • -CAfile : CA인증서(root CA와 체인인증서의 통합본)
  • -inkey : private key
  • -out : 변환할 PKCS12 키스토어파일

이 때 입력하는 비밀번호는 나중에 Spring Boot 웹 애플리케이션 상의 SSL/TLS 설정에 쓰이기 때문에 잘 기억해둬야 합니다.

CA인증서와 서버인증서를 통합한 인증서를 -in에 설정하여 변환해도 됩니다.


3) 프로퍼티에 SSL/TLS 인증서 설정하기

spring boot의 application.yml 에 SSL/TLS 인증서를 설정합니다.

server:
  address: demo.jiniworld.me
  servlet:
    context-path: /
  port: 443
  ssl:
    enabled: true
    enabled-protocols:
    - TLSv1.1
    - TLSv1.2
    key-store: "/etc/pki/tls/certs/demo/demo.p12"
    key-store-password: "demopass"
    key-store-type: "PKCS12"
  tomcat:
    basedir: .
    remote-ip-header: X-Forwarded-For
    protocol-header: X-Forwarded-Proto
  use-forward-headers: true
  • server.port
    • spring boot 앱을 서비스할 포트
  • server.ssl.enabled
    • SSL/TLS 활성화 여부
    • SSL/TLS 설정을 하고 싶다면 true로 설정해야 합니다.
  • server.ssl.enabled-protocols
    • 활성화된 프로토콜
  • server.ssl.key-store
    • .jks또는 .pfx파일 경로
  • server.ssl.key-store-password
    • 키스토어 비밀번호
  • server.ssl.key-store-type
    • 키스토어 타입(ex. JKS, PKCS12)

주의!!

만약, Apache 웹서버가 켜져있는 상태라면 443 포트는 사용할 수 없습니다.

***************************
APPLICATION FAILED TO START
***************************

Description:

The Tomcat connector configured to listen on port 443 failed to start. The port may already be in use or the connector may be misconfigured.

Action:

Verify the connector's configuration, identify and stop any process that's listening on port 443, or configure this application to listen on another port.

Apache 웹서버가 가동중인 상황에 443포트로 설정한 Spring Boot 앱을 실행했을 시 위와 같은 에러문구와 함께 앱 실행이 종료됩니다.


Apache 웹서버는 기본적으로 80포트와 443포트를 LISTEN하고 있습니다.

Spring Boot 단독앱으로 SSL/TLS 설정 후 HTTPS에 웹서비스를 하고싶다면, Apache 앱을 종료하거나 부트앱의 프로퍼티상의 server.port를 443포트가 아닌 다른 포트로 설정해야합니다.


4) 방화벽 개방

server.port를 8443으로 설정한 상태에서 앱을 실행해봅니다.

[jini@apple root]$ sudo netstat -nap | grep LISTEN | grep 8443
tcp6       0      0 150.95.212.203:8443     :::*                    LISTEN      3145/java

netstat 명령어를 통해 8443포트에 서비스가 LISTEN 되어있는걸 확인했으니 웹브라우저 상에서도 접속이 되어야 하는데 아래와 같이 사이트 접속이 안된다면

04

우리가 Spring Boot 앱에 설정했던 포트인 8443 포트가 방화벽 개방이 되어있는지 확인해야 합니다.

sudo firewall-cmd --list-ports

방화벽 설정되어있는 포트 목록을 조회해봅니다.
8443/tcp가 설정되어있지 않다면 추가하도록 합니다.

sudo firewall-cmd --permanent --remove-port=8443/tcp
sudo firewall-cmd --reload

8443/tcp포트를 영구 추가한 후 reload합니다.

sudo firewall-cmd --list-ports
8443/tcp

그리고 다시 조회하면 8443포트가 조회됩니다.

05

다시 접속해보면 위와 같이 사이트가 접속될 것입니다.


++

  • Embedded Tomcat에 HTTPS 설정하기
  • Embedded Tomcat에 SSL/TLS 설정하기
300x250
반응형