본문 바로가기
Projects/푸하하 - 개인 프로젝트

ubuntu에서 만든 pem 인증서로 Spring Boot에 적용하기

by 우인입니다 2023. 11. 9.

https://thiswooin.tistory.com/117

 

SSL인증서 발급 받기 (Let's encrypt, certbot, ubuntu, ec2, spring boot)

https://thiswooin.tistory.com/115 SSL인증서를 발급 받기 위해 도메인을 구매하고 이를 설정까지 마쳤다. SSL인증서를 발급받고, SSL? CA? SSL 인증서는 아무데서나 발급해주지 않는다. CA라고 불리는 인증기

thiswooin.tistory.com

 

도메인을 구입하고, SSL 인증서를 발급받았다.

이제 이 파일을 Springboot파일에 적용시켜 https 포트로 동작시켜볼 시간이다.

 

참고로, 우분투에서 생성하긴 했지만 인증서는 OS에 의존성을 갖진 않는다.

진행한 과정이 우분투에서일뿐.

 

아래의 순서로 진행했다.

 

  1. pem파일로 p12파일 생성하기.
  2. p12 권한설정 후 로컬로 가져오기.
  3. SpringBoot 프로젝트 폴더로 가져오고 세팅하기.
  4. http 리다이렉트 설정 (추가)

 

1. pem파일로 p12파일 생성

cd /etc/letsencrypt/live/[도메인]

 

해당 위치를 이동하면 pem파일이 있고, 이 위치는 인증서 발급받을 때 알려준다.

 

SpringBoot에서는 pem파일을 읽지 못한다.

그래서 아래 명령어로 pem파일을 토대로 p12파일로 만들어준다. + 비밀번호 잘 입력해주고

sudo openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out keystore.p12 -name [별칭 alias]

 

생성된 것을 확인했다.

 

 

2. p12 권한설정 후 로컬로 가져오기

 

keystore.p12파일이 생성됐는데, 파일 권한을 미리 바꿔줘야하는 경우도 있다.

sudo chmod 755 keystore.p12

권한을 바꿔준 모습.

 

' mv [해당파일] /home/ubuntu폴더 '명령어로 옮긴 후 가져왔다.

필자는 FileZilla를 통해서 로컬로 가져와 줬다. (각자 방법으로 가져오기)

 

3. SpringBoot 프로젝트 폴더로 가져와서 세팅하기

Root폴더에 두는 경우도 있는데 resources 폴더로 가져왔다.

 

applications.properties파일 수정

 

이처럼 각각 맞게 수정해준다.

근데 여기에 함정이 있었는데, 이것 때문에 5시간 날렸다.

 

아래 설정을 해줘야 한다..

 

덕분에 살았다........

 

 

그럼 이렇게 443(https) 포트로 실행되는 것을 알 수 있다.

 

 

4. http 리다이렉트 설정 (추가)

혹시나 http의 8080포트로 요청이 오면 https인 443포트로 리다이렉트 하는 설정도 추가했다.

config 폴더에 HttpsConfig를 생성해줬다.

 

@Configuration
public class HttpsConfig {

    @Bean
    public ServletWebServerFactory servletContainer() {
        // Enable SSL Trafic
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        // Add HTTP to HTTPS redirect
        tomcat.addAdditionalTomcatConnectors(httpToHttpsRedirectConnector());
        return tomcat;
    }

    private Connector httpToHttpsRedirectConnector() {
        Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
        connector.setScheme("http");
        connector.setPort(8080);
        connector.setSecure(false);
        connector.setRedirectPort(443);
        return connector;
    }
}

 

간략히 보자면 userconstraint를 none에서 confiential로 바뀌고 기본패턴 '/*' 추가해줬다.

그리고 밑에 private 메소드로 http로 포트를 하나 더 열어줬는데, 이는 443포트로 리다이렉트하게 해주는 역할로 지정해준 셈이다.

멀티커넥터라고 하기도 하는듯하다.

 

 

5. POSTMAN 테스트

 

이제 실행시켜보면 아래처럼 포트가 두 개 열린다.

 

https 요청 결과

 

응답코드200으로 잘 왔다.

하지만 로컬환경이기 때문에 인증서 도메인과는 달라 경고문구가 뜨긴한다.

 

http 요청 결과

 

302로 리다이렉션 후 200 응답을 받았다.