Category Archives: development

How set up Spring Boot to run HTTP/HTTPS ports

Spring Boot. 잘 모름.
새로 투입되는 프로젝트에서 Spring Boot로 프로젝트 구성하여 사용중인데, http로 작업하다가 일부 화면이 https적용이 필요하여 로컬 개발환경에서 spring boot기반으로 http/https를 동시에 띄워야 하는 상황이 발생.

일단 안써본 것이라서 잘 모름…ㅎㅎ
Spring Boot로 셋팅된 프로젝트 자체가 처음인지라…
일단 yaml…..야물은 또 뭐래?  라면서 검색.
여기서는 굳이 yaml이 뭔지 논외라서 패스.

application.yaml에 아래와 같이 설정되어 있었는데, 아래와 같이 수정.

server:
  port: 80
server:
  port: 443
  ssl:
      enabled: true
      key-alias: server
      key-store: "/~pathname~/keyStoreFile.jks"
      key-store-password: "keyStorePassword"
  http:
    port: 80

https 설정을 위한 사설인증서 생성은 아래 link 참조.
Java Keytool CSR Creation

detail하게 위의 링크를 모두 읽어 볼 필요는 없고, 과거 open-ssl로 작업했던거보다 간단.
위 링크의 상단 ssl인증서 생성용 기본정보 입력 후 Generate 버튼을 누르면 우측에 명령어가 생성됨.
그걸 복사해서…. 본인 개발환경의 jdk설치경로/bin/ 디렉토리 하위에서 해당 명령어를 실행하면 됨.
path에 jdk경로를 잡아둔 상태라면 그냥 keytool 이라고 입력해서 아무데서나 실행해도 될듯….
실행 후 비밀번호 입력하라고 나오면….여러번 같은 비밀번호로 입력 했으때, 최종적으로 *.csr / *.jks 파일이 생성되고, jks파일을 위의 설정에서 key-store에  경로로 입력하고, 지정한 비밀번호는 key-store-password에 입력.

https 443포트를 기본으로 띄우고, http 80은 server.http.port형태로 정의.

서버 구동시 https 443포트를 기본으로 구동하며  http는 spring boot가 어노테이션 기반의 Configuration을 읽어서 80 port로 구동하도록 아래와 같은 class를 추가. (당연히 spring component-scan이 이루어지는 package에 만들어야….)

package com.freesens.projectname;

import org.apache.catalina.connector.Connector;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class TomcatConfig {

    @Value("${server.http.port}")
    private int httpPort;
    @Bean
    public EmbeddedServletContainerCustomizer containerCustomizer() {
        return new EmbeddedServletContainerCustomizer() {
            @Override
            public void customize(ConfigurableEmbeddedServletContainer container) {
                if (container instanceof TomcatEmbeddedServletContainerFactory) {
                    TomcatEmbeddedServletContainerFactory containerFactory =
                            (TomcatEmbeddedServletContainerFactory) container;

                    Connector connector = new Connector(TomcatEmbeddedServletContainerFactory.DEFAULT_PROTOCOL);
                    connector.setPort(httpPort);
                    containerFactory.addAdditionalTomcatConnectors(connector);
                }
            }
        };
    }
}

설정 끝났으면 서버 구동하고, http/https로 각각 호출하여 정상 작동여부 확인하면 끝.

http://www.hostname.com/path.do
https://www.hostname.com/path.do

 

참고 링크.
– enabling-ssl-with-spring-boot-going-real
– how-set-up-spring-boot-to-run-https-http-ports

 

역시 검색을 잘해야 …….