Tag Archives: http

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

 

역시 검색을 잘해야 …….

weblogic 기반으로 https url 호출

블로그에 포스팅하는게 귀찮아서 한동안 뜸하다가 간만에 포스팅.
업무상 java코드로 https url을 호출하여 response body부분의 데이터를 읽어와야 하는 이슈가 있어서,  그냥 쉽게 생각하고 java.net.URLConnection을 이용해서 로컬에서 개발을 진행하고, 테스트를 해보니 작동이 잘되네…

로컬에서는 서블릿 컨테이너로 톰캣(tomcat)을 사용.
테스트서버 개발환경은 레진(resin)을 사용.
테스트서버에서도 잘 작동.

운영서버는 웹로직(weblogic)을 사용하는데 운영서버에 반영하니 아래와 같은 Exception 발생.
javax.net.ssl.SSLKeyException: Hostname verification failed: HostnameVerifier=weblogic.security.utils.SSLWLSHostnameVerifier

http://myfusionlearnings.blogspot.kr/2015/04/javaxnetsslsslkeyexception-failed.html
신나게 구글링을 해보니 위와 같은 링크가 나온다.  사실 내가 찾은건 아니고 고객사 시스템팀에서 참고하라고 찾아줌.
고객사의 경우 와일드카드인증서를 설치하여 사용중인데, weblogic에서 이게 문제이니, WAS 설정을 수정하거나, 자바 코드로 그냥 무조건 hostname 검증시 성공으로 반환하도록 우회하는 코드를 추가하면 된다고 하는데…..
일단 운영중인 서비스의 WAS설정을 변경하는건 무슨 사이드이펙트가 발생할지 예측이 힘들기 때문에 후자인 코드상에서 hostname 검증을 무조건 성공으로 반환하도록 수정했다.

힘들게 수정하고 tomcat, resin에서 정상작동을 확인하고 weblogic에 반영을 하니 이번에는 왠 ClassCastException이 발생한다.
java.lang.ClassCastException: weblogic.net.http.SOAPHttpsURLConnection cannot be cast to javax.net.ssl.HttpsURLConnection

http://idmoim.blogspot.kr/2014/03/javalangclasscastexception.html
음…. 또 구글링을 신나게 해보니 기껏 예외처리 하려고 수정한 HttpsURLConnection을 weblogic에서는 사용하지 않는단다.

그러면서 해결책은 또 WAS 설정에 옵션추가.
WAS설정을 변경하는건 이미 불가능한 입장이라 또 구글링을 한다.

https://community.oracle.com/thread/1066325
http://www.experts-exchange.com/Programming/Languages/Java/Q_27673676.html

웹로직에서는 HttpsURLConnection을 사용할 수 없으니 그냥 java.net.HttpURLConnection을 사용하되, java.net.URL 인스턴스 생성시 sun.net.www.protocol.https.Handler()로 생성해서 사용하라는 소리를 하기에 다시 소스를 원복하고 URL 인스턴스 생성 부분을 수정하고 HttpURLConnection으로 다시 수정.

tomcat 정상, resin 정상, weblogic 정상……………으로 추정됨;;;

weblogic까지 반영은 완료했으나, 로그 모니터링 권한이 없는 관계로.. 별 얘기가 없으면 잘 되는거겠지…라고 생각하며…. 이 늦은 시간에 집에 안가고 오늘의 삽질내역을 간만에 블로그에 포스팅 함.

덕분에 간만에 안되는 영어공부 신나게 함  ㅡ.ㅡ;