~☆~ 우하하!!~ 개발블로그

SpringBoot 프로젝트를 localhost에서 HTTPS 로 실행하도록 설정하기 본문

SpringBoot

SpringBoot 프로젝트를 localhost에서 HTTPS 로 실행하도록 설정하기

iwoohaha 2024. 12. 3. 11:16
반응형

HTTPS 로 실행하기 위해서는 SSL 인증서가 있어야 하는데, localhost 도메인에 대해서는 self-signed SSL 인증서를 만들면 된다.

self-signed SSL 인증서를 만드는 방법은 다양한데, 많이 사용되는 방법 몇 가지만 알아본다.

OpenSSL 을 사용하는 방법

1. 비공개 키 생성

openssl genrsa -out localhost.key 2048

결과로 localhost.key 파일(개인키)이 생성된다.

2. CSR(Certificate Signing Request) 생성

SSL/TLS 인증서를 발급받기 위해서 인증기관(Certificate Authority, CA)에 제출하는 데이터 파일인데, 인증서를 요청하는 도메인 소유자의 정보를 암호화하여 담고 있다.

openssl req -new -key localhost.key -out localhost.csr

데이터의 암호화를 위해 앞에서 생성한 개인키 파일(localhost.key)을 지정하고 있다. 생성되는 파일은 localhost.csr 이다.

3. Self-signed SSL 인증서 파일 생성

개인키 파일(localhost.key)과 요청데이터 파일(localhost.csr)을 이용해서 localhost.crt 라는 이름으로 SSL 인증서 파일을 생성한다.

openssl x509 -req -days 365 -in localhost.csr -signkey localhost.key -out localhost.crt

4. PKCS12 (.p12) 형식으로 변환

SpringBoot 에서는 .crt 파일과 .key 파일을 이용하여 .p12 형식의 파일로 변환해야 한다.

openssl pkcs12 -export -in localhost.crt -inkey localhost.key -out localhost.p12 -name aliasname

결과 파일로 localhost.p12 가 생성되었다. 이 과정에서 입력한 -name 파라미터값(aliasname)과 패스워드(YOUR_PASSWORD)를 잘 기억해놓았다가 SpringBoot 설정 파일에 기록해 주어야 한다.

5. 설정 파일에 SSL 설정 추가

application.properties 형식의 설정 파일 구성

server.port=8443
server.ssl.key-store=classpath:localhost.p12
server.ssl.key-store-password=YOUR_PASSWORD
server.ssl.key-store-type=PKCS12
server.ssl.key-alias=aliasname

application.yml 형식의 설정 파일 구성

server:
  port: 8443
  ssl:
    key-store: classpath:localhost.p12
    key-store-password: YOUR_PASSWORD
    key-store-type: PKCS12
    key-alias: aliasname

 

Keytool 을 사용하는 방법

1. 인증서 생성

.p12 형식의 인증서 파일 생성

keytool -genkeypair -alias aliasname -keyalg RSA -keystore keystore.p12 -storetype \
PKCS12 -validity 365 -keysize 2048

결과로 keystore.p12 파일이 생성된다.

.jks 형식의 인증서 파일 생성

keytool -genkeypair -alias aliasname -keyalg RSA -keystore keystore.jks -validity 365 \
-keysize 2048

결과로 keystore.jks 파일이 생성된다.

2. 설정 파일에 SSL 설정 추가

.p12 형식의 파일을 설정하는 방법은 위와 동일하다. 아래는 .jks 형식의 파일을 설정하는 방법이다.

application.properties 형식의 설정 파일 구성

server.port=8443
server.ssl.key-store=classpath:keystore.jks
server.ssl.key-store-password=YOUR_PASSWORD
server.ssl.key-store-type=JKS
server.ssl.key-alias=aliasname

application.yml 형식의 설정 파일 구성

server:
  port: 8443
  ssl:
    key-store: classpath:keystore.jks
    key-store-password: YOUR_PASSWORD
    key-store-type: JKS
    key-alias: aliasname

 

위 단계에서 생성된 SSL 파일(localhost.p12, keystore.p12, keystore.jks) 들이 프로젝트에서 위치해야 할 위치는 src/main/resources/ 이다(=> classpath:).

 

프로젝트를 빌드하여 실행시키면 로그에 아래와 같이 https 로 동작했다는 내용이 보인다.

웹브라우저에 https://localhost:8443 을 입력하면 주의 요함 이라는 경고표시가 나오는데, Self-signed SSL 인증서이기 때문에 표시되는거다.

인증서 세부정보 보기를 하면 아래와 같이 인증서 생성시 입력한 정보가 표시된다.

 

http 로 접속시 https 로 redirect 하는 동작을 일으키기 위해서는 다음과 같이 HttpRedirectConfig 클래스를 추가한다.

package com.woohahaapps.career.config;

import org.apache.catalina.connector.Connector;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.stereotype.Component;

@Component
public class HttpRedirectConfig implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {

    @Override
    public void customize(TomcatServletWebServerFactory factory) {
        factory.addAdditionalTomcatConnectors(createHttpConnector());
    }

    private Connector createHttpConnector() {
        Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
        connector.setPort(8080); // HTTP 포트
        connector.setScheme("http");
        connector.setSecure(false);
        connector.setRedirectPort(8443); // HTTPS 포트로 리다이렉트
        return connector;
    }
}

그리고 SecurityConfig 에 아래 내용을 추가한다.

...
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
        return httpSecurity
                // HTTPS 리다이렉트 설정
                .requiresChannel(channel -> channel
                        .anyRequest().requiresSecure()
                )
...

프로젝트를 빌드해서 실행시킨 후 브라우저에서 http://localhost:8080 으로 접속하면 https://localhost:8443 으로 redirect 되는 것을 확인할 수 있다.

 

반응형