HTTPS는 기존 HTTP 프로토콜에 데이터 암호화가 추가된 프로토콜
스프링 부트 프로젝트에서 HTTPS 프로토콜을 적용하는 방법에 대해 알아보자
JDK에서 제공하는 keytool을 사용해 Self-Signed Certificate(자체 서명된 인증서)를 발급해보자
그 중 PKCS12 형식으로 생성함 (패스워드로 보호된 형식으로서, 여러 인증서 및 키를 포함할 수 있고, Java 뿐만 아니라 여러 플랫폼에서 사용 가능)
keytool -genkey -alias spring -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 4000
# keystore : 개인키 파일
이후 사용할 패스워드와 정보를 입력하여 keystore 생성을 완료함
server:
port: 443
ssl:
key-store: keystore.p12
key-store-password: your-password
key-store-type: PKCS12
필수적인 요소는 위 ssl의 3가지 항목임
먼저 포트를 443으로 수정함으로서 HTTPS로 서버에 접근하도록 하며, ssl에서 방금 생성한 keystore, password, type을 입력해주면 됨
(keystore 파일을 resources 폴더로 옮기고 classpath:keystore.p12로 지정해주어도 됨)
위 두 작업으로 HTTPS 적용은 끝남
하지만 위처럼 '주의 요함' 혹은 경고 페이지를 만날 수 있음
Self-Signed Certificate(자체 서명된 인증서)이기 때문인데, 추후 Certbot(무료 인증서)을 활용하거나 유료 인증서를 발급 받아 해결할 수 있음
1. keystore
아래 명령을 통해 base64로 인코딩한 뒤,
openssl base64 -in [keystore file] -out [base64 file]
이를 Actions Secrets에 저장하여,
CI/CD 과정에서 keystore 파일을 생성해줌
echo ${{ secrets.KEYSTORE_BASE64 }} | base64 -d > keystore.p12
2. application.yml
application-ssl.yml
server:
ssl:
key-store: keystore.p12
key-store-password: your-password
key-store-type: PKCS12
password를 포함한 ssl 정보도 따로 Secrets로 관리하는 것이 좋을 듯함
이후 기존 application.yml
파일에는 아래처럼 설정함
spring:
profiles:
include:
- ...
- ssl
Actions Workflow 파일
echo "${{ secrets.APPLICATION_SSL_YML }}" > ./src/main/resources/application-ssl.yml
위처럼 불러와 yml 파일을 추가해주면 됨