Spring Boot

Spring Boot HTTPS 적용

iksadnorth 2023. 7. 28. 20:49

👣 개요

SSL 적용을 통한 보안 강화 및 HTTP/2를 사용하기 위한 기본 설정을 위한 절차.
SSL에 대한 개념적 설명은 다음 링크에 있다.

 

SSL/TLS

👣 개요 SSL은 초기 버전으로 차후 TLS로 명칭이 변경되었으나 보통 SSL/TLS라고 부른다. SSL은 Client와 Server가 통신할 때, 제 3자가 도청하지 못하도록 변조를 하는 방법이다. 👣 CA 등록 TLS Handshake를

ikadnorth.tistory.com

👣 무료 SSL 인증서 발급

무료 SSL 인증서를 발급해주는 CA 중 (Let's Encrypt) 라는 곳이 있다.
Let's Encrypt는 사용자에게 무료로 TLS 인증서를 발급해주는 비영리기관이다.
몇 가지 TLS 인증서 종류 중에서 완전 자동화가 가능한 DV (Domain Validated, 도메인 확인) 인증서를 무료로 발급한다. 
모질라 재단, 페이스북, 구글 등 많은 업체가 후원하고 있다.

발급된 인증서는 유효기간이 90일이며 만료 30일 전부터 갱신할 수 있다.
갱신 가능 횟수무제한이다.
단, 중복되는 도메인에 성공과 실패에 관계 없이 1주일 안에 5회 재발급이 카운트된다면,
해당 시간부터 1주일 동안 발급을 받을 수 없다.

위 내용 중 3개월에 1번씩 재발급해야 한다는 내용이 있다. 
매번 발급하는 것은 번거로울 수 있기에 Certbot을 이용해서 자동 갱신을 하게 하면 된다.
Certbot을 사용하여 웹 서버에 SSL 인증서를 설정하는 방법은 다음과 같다.

더보기

시작하기 전!!
해당 과정은 웹 어플리케이션이 이미 배포된 상태여야 하고 도메인 주소를 가지고 있어야 한다.

추가로 Certbot을 사용하기 이전에 어떤 방식으로 발급받을지에 대한 결정을 해야 한다.

  특징 장점 단점
standalone 웹 서버 없이 독립적으로
인증서 발급을
수행하는 방식.
인증서를 발급받기 위해
Certbot이 임시 웹 서버
구동하고, 웹 서버가 80번 포트를 사용하고 있지 않아야 합니다.
즉, 현재 웹 서버와는 독립적으로 동작합니다.

다른 웹 서버와 독립적으로 인증서를 발급할 수 있습니다.
웹 서버의 설정을 변경할 필요가 없습니다.
인증서 갱신을 위해 임시 웹 서버를 구동해야 하므로 추가적인 리소스 사용이 필요합니다.
80번 포트를 사용할 수 없는 환경에서는 사용할 수 없습니다.
webroot 이미 운영 중인 웹 서버의
Document Root를 이용하여
인증서 발급을 수행하는
방식입니다.
즉, 웹 서버가 80번 포트로
동작하고 있어야 합니다.
웹 서버와의 통합이 가능하여 기존의 웹 서버 환경을 유지할 수 있습니다.
인증서 발급 시 웹 서버를 중단없이 발급됩니다.
웹 서버가 HTTP 요청을 받을 수 있어야 하므로, HTTP를 사용하는 웹 서비스를 운영하고 있는 경우에만 사용할 수 있습니다.

 

1. Certbot 설치

sudo apt-get install certbot

 

2. 인증서 발급
결과적으로 인증서와 개인키 파일이 생성된다.

# certbot certonly --{인증 방식} -d {발급받으려는 도메인 주소}
certbot certonly --standalone -d yourdomain.com

 

3. 인증서 갱신

certbot renew

 

4. 인증서 완전 자동화

# Crontab 편집
crontab -e

# 내부 내용 수정
# 매월 1일 02시 00분에 실행토록함.
0 2 1 * * /usr/bin/certbot renew

👣 Key Store

SSL(Secure Socket Layer) 통신에 사용되는 인증서개인 키를 안전하게 저장하는 데이터 저장소.

공개키 인증서
서버의 공개키를 포함한 인증서가 저장됨.
이 인증서는 클라이언트에게 제공되어 서버의 신원을 검증하는데 사용됨.

개인 키
서버의 개인 키가 저장됨. 개인 키는 서버가 클라이언트와의 통신에 사용하는 비밀 키로, 서버만 알고 있어야 함.

생성 방법
만약 인증서 파일인 cert.pem과 개인 키 파일인 private.pem 파일을 가지고 있다면,
KeyStore 파일은 다음과 같이 만들 수 있다.

# openssl {사용할 형식} -export 
# -out {Key Store 파일명}.p12 
# -inkey {개인키 파일명}.pem 
# -in {인증서 파일명}.pem
# -CAfile chain.pem 
# -caname root

openssl pkcs12 -export -out keystore.p12 -inkey private.pem -in fullchain.pem -CAfile chain.pem -caname root

# 해당 명령어 이후 '비밀번호'를 입력하라고 뜸. 이 비밀번호를 기억해야 함.

 

👣 PKCS #12

PKCS (Public-Key Cryptography Standard) 란?

PKCS는 공개키 기반 구조 (PKI, Public Key Infrastructure)에서 인터넷을 이용해
안전하게 정보를 교환하기 위한 제조사간 비공식 표준 프로토콜.

PKCS #12 란?
용자의 개인정보(사용자의 개인키, 인증 등)의 저장과 교환을 위한 포맷.
보통 .pfx , .p12 등의 확장자로 저장한다.
바이너리 형식으로 저장되며 pkcs#12 포멧의 파일은 인증서, 개인키 내용을 파일 하나에 모두 담고 있다.
p12파일은 PKCS#12 형식으로 certificate(public)과 private key를 포함하고 있는 key store 파일이며
패스워드로 암호화 되어있다. 열어서 내용을 확인하려면 패스워드가 필요하다.

 

👣 적용 과정.

1. SSL 인증서 생성

SSL 인증서를 구입하거나 무료 인증 기관(Ex. Let's Encrypt)을 사용하여 인증서를 생성.
인증서는 일반적으로 .pem 또는 .crt 확장자를 가지는 파일이다. 아래는 예시다.

// SSL 인증서 파일(cert.pem)
-----BEGIN CERTIFICATE-----
MIIDejCCAmICCQCYq6x57MLwTzANBgkqhkiG9w0BAQsFADBFMQswCQYDVQQGEwJB
VTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0
...
0gAJNBklDz4kIEHRvHlkShwBGnWJ2OsE2z8xGUEc9Vqyka5iU7ggfIdrJeNQFggX
lUPtMg==
-----END CERTIFICATE-----

// 개인키 파일(private.pem)
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDJx3UKxTkCJqN9k
...
DfGfUGS68OZbhGV9mBpvXDI25/HXVBbX3LUguFO/yrnay<|endoftext|>

2. SSL 인증서와 비밀키 파일을 이용해 Key Store 파일 생성.

openssl pkcs12 -export -out keystore.p12 -inkey private.pem -in cert.pem

3. application.yml 파일에 SSL 설정 추가

SSL을 위한 설정을 추가함.
key-store : KeyStore 파일이 존재하는 경로.
key-store-password : KeyStore 파일의 비밀번호.
key-store-type : KeyStore 타입.

server:
  port: 443
  ssl:
    enabled: true
    key-store: classpath:keystore.p12
    key-store-password: your-keystore-password
    key-store-type: PKCS12

'Spring Boot' 카테고리의 다른 글

Spring Boot 외부 설정법  (0) 2023.07.28
Spring Boot HTTP2 적용  (0) 2023.07.28
Executable Jar  (0) 2023.07.28
application.yml 프로퍼티  (0) 2023.07.27
Spring Boot 버전 관리 원리  (0) 2023.07.27